zhuang il y a 1 an
Parent
commit
040b42558f

+ 296 - 0
src/app/routes/passport/freeLoginInline/loginFreeInline.component.ts

@@ -0,0 +1,296 @@
+import { PlatformLocation } from '@angular/common';
+import { Component, Inject, OnDestroy, OnInit, Optional } from '@angular/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { Router } from '@angular/router';
+import { GeneralHttpService, GeneralUtilsService, StartupService } from '@core';
+import { ReuseTabService } from '@delon/abc/reuse-tab';
+import { ACLService } from '@delon/acl';
+import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
+import { CacheService } from '@delon/cache';
+import { _HttpClient, MenuService, SettingsService, TitleService } from '@delon/theme';
+// import { environment } from '@env/environment';
+import { NzMessageService } from 'ng-zorro-antd/message';
+import { NzModalService } from 'ng-zorro-antd/modal';
+import { NzNotificationService } from 'ng-zorro-antd/notification';
+
+@Component({
+  selector: 'passport-free-login-inline',
+  templateUrl: './loginFreeInline.component.html',
+  styleUrls: ['./loginFreeInline.component.less']
+})
+export class UserLoginFreeInlineComponent implements OnInit {
+  loginType = [];
+  form: FormGroup;
+  error = '';
+  type = 0;
+  code = '';
+
+  // #region get captcha
+
+  count = 0;
+  interval$: any;
+  computerModel = false;
+  computerIp = '';
+  computerMac = '';
+  computerSerial = '';
+  mainBoardSerial = '';
+  promptInfo = '';
+  smscode = '';
+  rescode = '';
+  resmobile = '';
+
+  customRouterUrl = '';
+  customLoginType = 'SingleSignOn';
+  otherPars = '';
+  // 免密登录用户
+  secretFreeUser = '';
+  // 免密登录连接
+  secretFreeUrl = '';
+  // 免密登录参数
+  secretFreeUrlPar = '';
+  secretFreeUrlLimit = '';
+
+  constructor(
+    fb: FormBuilder,
+    modalSrv: NzModalService,
+    private router: Router,
+    private menuService: MenuService,
+    private settingsService: SettingsService,
+    private aclService: ACLService,
+    // private socialService: SocialService,
+    @Optional()
+    @Inject(ReuseTabService)
+    private reuseTabService: ReuseTabService,
+    @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService,
+    private startupSrv: StartupService,
+    public http: _HttpClient,
+    public msg: NzMessageService,
+    public utils: GeneralUtilsService,
+    private titleService: TitleService,
+    private httpUtils: GeneralHttpService,
+    public srv: CacheService,
+    private notification: NzNotificationService,
+    private location: PlatformLocation
+  ) {
+    this.form = fb.group({
+      userName: [null, [Validators.required, Validators.minLength(4)]],
+      password: [null, Validators.required],
+      mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]],
+      captcha: [null, [Validators.required]],
+      remember: [true]
+    });
+    modalSrv.closeAll();
+  }
+
+  ngOnInit(): void {
+    console.log(this.location);
+    const freeLoginUrl = this.location.href.replace('%3D', '=');
+    console.log('freeLoginUrl', freeLoginUrl);
+    if (freeLoginUrl) {
+      const urls = freeLoginUrl.split('?');
+      if (urls && urls[1]) {
+        if (urls[1].indexOf('token=') >= 0) {
+          const strs = urls[1].split('&');
+          let rid = '';
+          strs.forEach(v => {
+            if (v.indexOf('token=') === 0) {
+              rid = v.replace('token=', '');
+            } else if (v.indexOf('customRouterUrl=') === 0) {
+              this.customRouterUrl = v.replace('customRouterUrl=', '');
+            } else {
+              if (this.otherPars === '') {
+                this.otherPars = v;
+              } else {
+                this.otherPars = this.otherPars + '&' + v;
+              }
+            }
+          });
+          this.login(rid);
+        } else if (urls[1].indexOf('secretFreeUser=') === 0) {
+          this.customLoginType = 'secretFree';
+          const strs = urls[1].split('&');
+          this.secretFreeUser = strs[0].replace('secretFreeUser=', '');
+          this.secretFreeUrl = strs[1].replace('secretFreeUrl=', '');
+          if (strs.length === 3) {
+            if (strs[2].indexOf('secretFreeUrlLimit=') === 0) {
+              this.secretFreeUrlLimit = strs[2].replace('secretFreeUrlLimit=', '');
+            }
+          }
+
+          if (strs.length > 2) {
+            for (let i = 2; i < strs.length; i++) {
+              if (strs[i].indexOf('secretFreeUrlLimit=') === -1) {
+                if (this.secretFreeUrlPar === '') {
+                  this.secretFreeUrlPar = strs[i];
+                } else {
+                  this.secretFreeUrlPar = this.secretFreeUrlPar + '&' + strs[i];
+                }
+              }
+            }
+          }
+          this.login(this.secretFreeUser);
+        } else if (urls[1].indexOf('code=') >= 0) {
+          this.customLoginType = 'bySso';
+          const rid = urls[1].replace('code=', '');
+          this.login(rid);
+        }
+        // const pars = par.split('_');
+        // const userName = this.decode(pars[0]);
+        // const passWord = this.decode(pars[1]);
+      } else {
+        console.log('error');
+      }
+    }
+  }
+
+  decode(ciphertext: String) {
+    let _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+    var t = '';
+    var n, r, i;
+    var s, o, u, a;
+    var f = 0;
+    ciphertext = ciphertext.replace(/[^A-Za-z0-9+/=]/g, '');
+    while (f < ciphertext.length) {
+      s = _keyStr.indexOf(ciphertext.charAt(f++));
+      o = _keyStr.indexOf(ciphertext.charAt(f++));
+      u = _keyStr.indexOf(ciphertext.charAt(f++));
+      a = _keyStr.indexOf(ciphertext.charAt(f++));
+      n = (s << 2) | (o >> 4);
+      r = ((o & 15) << 4) | (u >> 2);
+      i = ((u & 3) << 6) | a;
+      t = t + String.fromCharCode(n);
+      if (u != 64) {
+        t = t + String.fromCharCode(r);
+      }
+      if (a != 64) {
+        t = t + String.fromCharCode(i);
+      }
+    }
+    t = this.utf8Ddecode(t);
+    return t;
+  }
+  utf8Ddecode(e: String) {
+    var t = '';
+    var n = 0;
+    var r = 0;
+    var c1 = 0;
+    var c2 = 0;
+    while (n < e.length) {
+      r = e.charCodeAt(n);
+      if (r < 128) {
+        t += String.fromCharCode(r);
+        n++;
+      } else if (r > 191 && r < 224) {
+        c1 = e.charCodeAt(n + 1);
+        t += String.fromCharCode(((r & 31) << 6) | (c1 & 63));
+        n += 2;
+      } else {
+        c1 = e.charCodeAt(n + 1);
+        c2 = e.charCodeAt(n + 2);
+        t += String.fromCharCode(((r & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
+        n += 3;
+      }
+    }
+    return t;
+  }
+
+  login(rid: any) {
+    let ppstUrl = 'inControlServer/sys/login/loginInSso?_allow_anonymous=true';
+    if (this.customLoginType === 'secretFree') {
+      ppstUrl = 'inControlServer/sys/login/loginSecretFree?secretFreeUser=' + this.secretFreeUser;
+      if (this.secretFreeUrlLimit === '1') {
+        ppstUrl = 'inControlServer/sys/login/loginSecretFreeLimit?secretFreeUser=' + this.secretFreeUser;
+      }
+    } else if ((this.customLoginType = 'bySso')) {
+      ppstUrl = `inControlServer/qualityInspection/sysLogin/loginSso?_allow_anonymous=true`;
+    }
+
+    this.http
+      // .post('/login/account?_allow_anonymous=true', {
+      // .post('server/system/userLogin?_allow_anonymous=true', {
+      .post(ppstUrl, {
+        // type: this.type,
+        rid
+      })
+      .subscribe({
+        next: (res: any) => {
+          if (res.msg !== 'success') {
+            this.error = res.msg;
+            this.code = res.code;
+            return;
+          }
+          // 清空路由复用信息
+          this.reuseTabService.clear();
+          // 设置用户Token信息
+          // this.tokenService.set(res.user);
+          this.tokenService.set(res.data);
+          const tokenInfo: any = res.data.userInfo;
+          this.srv.set('ic_userInfo', tokenInfo, { type: 'm' });
+          const treeList = this.utils.getMenuFromUserInfo(res.data.userInfo);
+          if (treeList[0]) {
+            treeList[0].text = '主导航';
+            treeList[0].group = true;
+            treeList[0].open = true;
+            if (treeList[0].children && treeList[0].children[0]) {
+              treeList[0].children[0].open = true;
+            }
+            this.menuService.add(treeList);
+          }
+          // Application information: including site name, description, year
+          tokenInfo.appInfos = {
+            name: 'in-control',
+            description: '融为inControl平台前端框架'
+          };
+          tokenInfo.userInfos = {
+            name: tokenInfo.name,
+            avatar: tokenInfo.portrait,
+            email: tokenInfo.email,
+            token: res.data.token
+          };
+          if (!tokenInfo.userInfos.avatar || tokenInfo.userInfos.avatar.length < 2) {
+            tokenInfo.userInfos.avatar = 'http://i2.tiimg.com/674794/2b045fc622344d1c.png';
+          }
+          this.settingsService.setApp(tokenInfo.appInfos);
+          // User information: including name, avatar, email address
+          this.settingsService.setUser(tokenInfo.userInfos);
+          // ACL: Set the permissions to full, https://ng-alain.com/acl/getting-started
+          this.aclService.setFull(true);
+          this.titleService.suffix = tokenInfo.appInfos.name;
+          let url = this.tokenService.referrer!.url || '/';
+          if (url.includes('/passport') || url === '/') {
+            url = treeList[0].children[0].link;
+          }
+          // 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响
+          this.startupSrv.load().subscribe(() => {
+            if ((this.customLoginType = 'secretFree' && this.secretFreeUrl)) {
+              let routerUrl = this.secretFreeUrl.replace(/%2F/g, '/');
+              if (this.secretFreeUrlPar) {
+                routerUrl = routerUrl + '?' + this.secretFreeUrlPar;
+              }
+              setTimeout(() => this.router.navigateByUrl(routerUrl));
+            } else {
+              let url = this.tokenService.referrer!.url || '/';
+              if (this.customRouterUrl) {
+                url = this.customRouterUrl;
+                if (this.otherPars && this.otherPars !== '') {
+                  url = url + '?' + this.otherPars;
+                }
+              } else {
+                if (url.includes('/passport') || url === '/') {
+                  url = treeList[0].children[0].link;
+                }
+              }
+              url = url.replace(/%2F/g, '/');
+              // this.router.navigateByUrl('/page/s/c8aa07a9e3fe4761bc007707bf5cfc77');
+              // setTimeout(() => this.router.navigateByUrl(url));
+            }
+          });
+        },
+        error: (error: any) => {
+          this.notification.error('获取内联表格配置失败', '');
+          console.error(error);
+        },
+        complete: () => {}
+      });
+  }
+}

+ 14 - 0
src/ssoLogin.html

@@ -0,0 +1,14 @@
+<html>
+  <body> </body>
+  <script type="text/javascript">
+    console.log(this.location);
+    const freeLoginUrl = this.location.href.replace('%3D', '=');
+    console.log('freeLoginUrl', freeLoginUrl);
+    if (freeLoginUrl) {
+      const urls = freeLoginUrl.split('?');
+      if (urls && urls[1]) {
+        window.location.href = 'https://cxqm.zpmc.com/#/passfreeinline' + '?' + urls[1];
+      }
+    }
+  </script>
+</html>