fmode-ng 0.0.40 → 0.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +1 -1
- package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +1 -1
- package/esm2022/lib/user/login/auth.service.mjs +1 -1
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +1 -1
- package/fesm2022/fmode-ng.mjs +1 -1
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/voice/stream.player.d.ts +10 -0
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +18 -3
- package/lib/user/modal-user-login/modal-user-login.component.d.ts +4 -2
- package/package.json +1 -1
package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{Component,Input}from"@angular/core";import{IonButton,IonIcon,IonSpinner,ModalController,ToastController}from"@ionic/angular/standalone";import{FmodeVoiceService}from"../../../voice/fmode-voice.service";import{FmodeChat}from"../../../service-fmai/service-chat";import{CommonModule}from"@angular/common";import{NovaUploadService}from"../../../../storage/service-upload/nova-upload.service";import Parse from"parse";import*as i0 from"@angular/core";import*as i1 from"../../../voice/fmode-voice.service";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../../../storage/service-upload/nova-upload.service";import*as i4 from"@angular/common";export class ModalAudioMessageComponent{constructor(e,i,t){this.voiceServ=e,this.toastCtrl=i,this.uploadServ=t,this.isRecording=!1,this.player=new Audio,this.clockStr="0:00"}ngOnInit(){this.chat.userInput="",this.initVoiceSevice(),this.voiceServ.startTalk()}playMusic(e){this.player||(this.player=new Audio),this.player.src=`/assets/avatar/voice/${e}.mp3`;try{this.player?.play()}catch(e){}}initVoiceSevice(){this.chat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.chat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onAfterRecordStart=()=>{this.isRecording=!0,this.timerInt=setInterval((()=>{this.countTimer()}),1e3)},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.chat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{},this.voiceServ.onBeforeFinishTalk=()=>{this.chat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=async()=>{console.log("onAfterFinishTalk1",this.voiceServ?.resultText),console.log("onAfterFinishTalk2",this.voiceServ?.resultTextTemp),this.chat.userInput=""+(this.voiceServ?.resultTextTemp||this.voiceServ?.resultText),this.chat?.userInput&&await this.saveChatVoice(),this.sendMessage()}}async saveChatVoice(){let e=this.voiceServ.recordWavBlob,i=this.voiceServ.recordDuration;if(e){let t=Parse.Object.extend("ChatVoice");this.chatVoice=new t,this.chatVoice.set("content",this.chat.userInput),this.chatVoice.set("role","user"),this.chatVoice.set("duration",i);let n=localStorage.getItem("company");n&&this.chatVoice.set("company",{__type:"Pointer",className:"Company",objectId:n}),Parse.User.current()?.id&&this.chatVoice.set("user",Parse.User.current().toPointer());let o=this.chatVoice?.id||this.uploadServ?.genMd5(this.chatVoice?.get("content")||this.chatVoice?.get("ssml")),a=new Date,s=o+a.getFullYear()+(a.getMonth()+1)+a.getDate()+a.getHours()+a.getMinutes()+a.getSeconds()+".wav",r=new File([e],s,{type:"audio/wav"}),c=await this.uploadServ.upload(r,(e=>{console.log(e)})),l={__type:"Pointer",className:"Attachment",objectId:c?.id};l?.objectId&&(this.chatVoice.set("voiceFile",l),this.chatVoice=await this.chatVoice.save())}}async sendMessage(){if(this.chat.userInput)this.chat?.sendMessage(""+this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}},{id:this.chatVoice?.id,duration:this.chatVoice?.get("duration")});else{(await this.toastCtrl.create({message:"内容不能为空",position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}}countTimer(){this.now||(this.now=new Date);let e=(new Date).getTime()-this.now.getTime();e/=1e3,e/1e3>59&&this.send(),this.clockStr=(e/60).toFixed(0)+":"+String((e%60).toFixed(0)).padStart(2,"0")}cancel(){this.clear(),this.voiceServ.cancelTalk(),this.modal?.dismiss(null,"cancel")}send(){this.clear(),this.voiceServ.finishTalk(),this.modal?.dismiss(null,"send")}clear(){this.timerInt&&clearInterval(this.timerInt),this.now=void 0,this.isRecording=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,deps:[{token:i1.FmodeVoiceService},{token:i2.ToastController},{token:i3.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalAudioMessageComponent,isStandalone:!0,selector:"fm-modal-audio-message",inputs:{chat:"chat",modal:"modal"},providers:[ModalController],ngImport:i0,template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n <div class="timer row">\n {{clockStr || "0:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n <div class="actions row">\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%}.modal-area .row{margin:10px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i4.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonSpinner,selector:"ion-spinner",inputs:["color","duration","name","paused"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,decorators:[{type:Component,args:[{selector:"fm-modal-audio-message",standalone:!0,imports:[CommonModule,IonButton,IonIcon,IonSpinner],providers:[ModalController],template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n <div class="timer row">\n {{clockStr || "0:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n <div class="actions row">\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%}.modal-area .row{margin:10px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"]}]}],ctorParameters:()=>[{type:i1.FmodeVoiceService},{type:i2.ToastController},{type:i3.NovaUploadService}],propDecorators:{chat:[{type:Input}],modal:[{type:Input}]}});
|
|
8
|
+
import{Component,Input}from"@angular/core";import{IonButton,IonIcon,IonSpinner,ModalController,ToastController}from"@ionic/angular/standalone";import{FmodeVoiceService}from"../../../voice/fmode-voice.service";import{FmodeChat}from"../../../service-fmai/service-chat";import{CommonModule}from"@angular/common";import{NovaUploadService}from"../../../../storage/service-upload/nova-upload.service";import Parse from"parse";import*as i0 from"@angular/core";import*as i1 from"../../../voice/fmode-voice.service";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../../../storage/service-upload/nova-upload.service";import*as i4 from"@angular/common";export class ModalAudioMessageComponent{constructor(e,i,t){this.voiceServ=e,this.toastCtrl=i,this.uploadServ=t,this.isRecording=!1,this.player=new Audio,this.clockStr="0:00"}ngOnInit(){this.chat.userInput="",this.initVoiceSevice(),this.voiceServ.startTalk()}playMusic(e){this.player||(this.player=new Audio),this.player.src=`/assets/avatar/voice/${e}.mp3`;try{this.player?.play()}catch(e){}}initVoiceSevice(){this.chat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.chat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onAfterRecordStart=()=>{this.isRecording=!0,this.timerInt=setInterval((()=>{this.countTimer()}),1e3)},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.chat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{},this.voiceServ.onBeforeFinishTalk=()=>{this.chat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=async()=>{console.log("onAfterFinishTalk1",this.voiceServ?.resultText),console.log("onAfterFinishTalk2",this.voiceServ?.resultTextTemp),this.chat.userInput=""+(this.voiceServ?.resultTextTemp||this.voiceServ?.resultText),this.chat?.userInput&&await this.saveChatVoice(),this.sendMessage()}}async saveChatVoice(){let e=this.voiceServ.recordWavBlob,i=this.voiceServ.recordDuration;if(e){let t=Parse.Object.extend("ChatVoice");this.chatVoice=new t,this.chatVoice.set("content",this.chat.userInput),this.chatVoice.set("role","user"),this.chatVoice.set("duration",i);let n=localStorage.getItem("company");n&&this.chatVoice.set("company",{__type:"Pointer",className:"Company",objectId:n}),Parse.User.current()?.id&&this.chatVoice.set("user",Parse.User.current().toPointer());let o=this.chatVoice?.id||this.uploadServ?.genMd5(this.chatVoice?.get("content")||this.chatVoice?.get("ssml")),a=new Date,s=o+a.getFullYear()+(a.getMonth()+1)+a.getDate()+a.getHours()+a.getMinutes()+a.getSeconds()+".wav",r=new File([e],s,{type:"audio/wav"}),c=await this.uploadServ.upload(r,(e=>{console.log(e)})),l={__type:"Pointer",className:"Attachment",objectId:c?.id};l?.objectId&&(this.chatVoice.set("voiceFile",l),this.chatVoice=await this.chatVoice.save())}}async sendMessage(){if(this.chat.userInput)this.chat?.sendMessage(""+this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}},{id:this.chatVoice?.id,duration:this.chatVoice?.get("duration")});else{(await this.toastCtrl.create({message:"内容不能为空",position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}}countTimer(){this.now||(this.now=new Date);let e=(new Date).getTime()-this.now.getTime();e/=1e3,e/1e3>59&&this.send(),this.clockStr=e<60?(60-e).toFixed(0)+"s":"0s"}cancel(){this.clear(),this.voiceServ.cancelTalk(),this.modal?.dismiss(null,"cancel")}send(){this.clear(),this.voiceServ.finishTalk(),this.modal?.dismiss(null,"send")}clear(){this.timerInt&&clearInterval(this.timerInt),this.now=void 0,this.isRecording=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,deps:[{token:i1.FmodeVoiceService},{token:i2.ToastController},{token:i3.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalAudioMessageComponent,isStandalone:!0,selector:"fm-modal-audio-message",inputs:{chat:"chat",modal:"modal"},providers:[ModalController],ngImport:i0,template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n <div class="timer row">\n {{clockStr || "0:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n <div class="actions row">\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%}.modal-area .row{margin:10px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i4.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonSpinner,selector:"ion-spinner",inputs:["color","duration","name","paused"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,decorators:[{type:Component,args:[{selector:"fm-modal-audio-message",standalone:!0,imports:[CommonModule,IonButton,IonIcon,IonSpinner],providers:[ModalController],template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n <div class="timer row">\n {{clockStr || "0:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n <div class="actions row">\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%}.modal-area .row{margin:10px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"]}]}],ctorParameters:()=>[{type:i1.FmodeVoiceService},{type:i2.ToastController},{type:i3.NovaUploadService}],propDecorators:{chat:[{type:Input}],modal:[{type:Input}]}});
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1tb2RhbC1pbnB1dC9tb2RhbC1hdWRpby1tZXNzYWdlL21vZGFsLWF1ZGlvLW1lc3NhZ2UuY29tcG9uZW50Lm1qcw==`
|
|
10
10
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/stream.player.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{PushAudioOutputStreamCallback}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/Audio/PushAudioOutputStreamCallback";export class FmPushAudioOutputStreamCallback extends PushAudioOutputStreamCallback{constructor(){super(),this.audioContext=new window.AudioContext,this.source=null,this.buffer=[]}write(t){this.buffer.push(t),this.playAudio()}playAudio(){this.source&&this.source.stop();const t=this.audioContext.createBuffer(1,this.buffer.length,this.audioContext.sampleRate);t.copyToChannel(new Float32Array(this.buffer),0),this.source=this.audioContext.createBufferSource(),this.source.buffer=t,this.source.connect(this.audioContext.destination),this.source.start(),this.buffer=[]}close(){this.source&&this.source.stop(),this.audioContext.close()}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3N0cmVhbS5wbGF5ZXIubWpz`
|
|
10
|
+
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{SpeechSynthesizer}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";import{SpeechConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";import{ResultReason}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";import Parse from"parse";import{AudioPlayer}from"../audio.player";export class FmodeTTS{constructor(e,t){this.uploadServ=t,this.subscriptionKey=e?.subscriptionKey,this.authorizationToken=e?.token,this.region=e?.region,this.subscriptionKey&&(this.speechConfig=SpeechConfig.fromSubscription(this.subscriptionKey,this.region)),this.authorizationToken&&(this.speechConfig=SpeechConfig.fromAuthorizationToken(this.authorizationToken,this.region)),this.synthesizer=new SpeechSynthesizer(this.speechConfig)}extractTextFromXML(e){const t=/>([^<]+)</g;let o,i=[];for(;null!==(o=t.exec(e));){const e=o[1].trim();e&&i.push(e)}return i.join(" ")}extractSSMLContent(e){var t=e.match(/<speak.*?<\/speak>/s);return t?t[0]:e}async speakAsync(e,t,o){if(!t){let o=Parse.Object.extend("ChatVoice");(t=new o).set("ssml",e),t.set("content",this.extractTextFromXML(e));let i=localStorage.getItem("company");i&&t.set("company",{__type:"Pointer",className:"Company",objectId:i}),Parse.User.current()?.id&&t.set("user",Parse.User.current().toPointer())}if(!t?.get("voiceFile")){let o=[];t?.get("content")&&o.push({content:t?.get("content")}),e&&o.push({ssml:e});let i=Parse.Query.fromJSON("ChatVoice",{include:"voiceFile",where:{$or:o}}),s=await i.first();t.set("voiceFile",s?.get("voiceFile"))}return t?.get("voiceFile")?(this.playAudioData(t?.get("voiceFile")?.get("url"),t,o),t):(e=this.extractSSMLContent(e),new Promise(((i,s)=>{const n=Date.now();let r="speakTextAsync";e?.indexOf("<")>-1&&(r="speakSsmlAsync"),this.eventMap?.onSpeakBefore&&this.eventMap?.onSpeakBefore(),this.synthesizer[r](e,(e=>{if(console.log(e),e.reason===ResultReason.SynthesizingAudioCompleted){this.eventMap?.onAudioCompleted&&this.eventMap?.onAudioCompleted();const s=Date.now();let r=e?.audioData;t.set("duration",Number(e?.audioDuration)/1e4),this.playAudioData(r,t,o),console.log(`Audio synthesis finished. Duration: ${s-n} ms`),setTimeout((()=>{o?.onStop()&&o?.onStop()}),2e3),i(t)}else s(`Speech synthesis failed. Reason: ${e.errorDetails}`)}),(e=>{s(`Error occurred during synthesis: ${e}`)}))})))}onBreak(e){}playAudioData(e,t,o){let i;if(console.log("audioData",e)
|
|
8
|
+
import{SpeechSynthesizer}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";import{SpeechConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";import{ResultReason}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";import Parse from"parse";import{AudioConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/Audio/AudioConfig";import{AudioPlayer}from"../audio.player";import{FmPushAudioOutputStreamCallback}from"../stream.player";export class FmodeTTS{constructor(e,t){this.uploadServ=t,this.subscriptionKey=e?.subscriptionKey,this.authorizationToken=e?.token,this.region=e?.region,this.subscriptionKey&&(this.speechConfig=SpeechConfig.fromSubscription(this.subscriptionKey,this.region)),this.authorizationToken&&(this.speechConfig=SpeechConfig.fromAuthorizationToken(this.authorizationToken,this.region));let o=new FmPushAudioOutputStreamCallback;this.audioConfig=AudioConfig.fromStreamOutput(o),this.synthesizer=new SpeechSynthesizer(this.speechConfig,this.audioConfig)}extractTextFromXML(e){const t=/>([^<]+)</g;let o,i=[];for(;null!==(o=t.exec(e));){const e=o[1].trim();e&&i.push(e)}return i.join(" ")}extractSSMLContent(e){var t=e.match(/<speak.*?<\/speak>/s);return t?t[0]:e}async speakAsync(e,t,o){if(!t){let o=Parse.Object.extend("ChatVoice");(t=new o).set("ssml",e),t.set("content",this.extractTextFromXML(e));let i=localStorage.getItem("company");i&&t.set("company",{__type:"Pointer",className:"Company",objectId:i}),Parse.User.current()?.id&&t.set("user",Parse.User.current().toPointer())}if(!t?.get("voiceFile")){let o=[];t?.get("content")&&o.push({content:t?.get("content")}),e&&o.push({ssml:e});let i=Parse.Query.fromJSON("ChatVoice",{include:"voiceFile",where:{$or:o}}),s=await i.first();t.set("voiceFile",s?.get("voiceFile"))}return t?.get("voiceFile")?(this.playAudioData(t?.get("voiceFile")?.get("url"),t,o),t):(e=this.extractSSMLContent(e),new Promise(((i,s)=>{const n=Date.now();let r="speakTextAsync";e?.indexOf("<")>-1&&(r="speakSsmlAsync"),this.eventMap?.onSpeakBefore&&this.eventMap?.onSpeakBefore(),this.synthesizer[r](e,(e=>{if(console.log(e),e.reason===ResultReason.SynthesizingAudioCompleted){this.eventMap?.onAudioCompleted&&this.eventMap?.onAudioCompleted();const s=Date.now();let r=e?.audioData;t.set("duration",Number(e?.audioDuration)/1e4),this.playAudioData(r,t,o),console.log(`Audio synthesis finished. Duration: ${s-n} ms`),setTimeout((()=>{o?.onStop()&&o?.onStop()}),2e3),i(t)}else s(`Speech synthesis failed. Reason: ${e.errorDetails}`)}),(e=>{s(`Error occurred during synthesis: ${e}`)}))})))}onBreak(e){}async playAudioData(e,t,o){let i;if(console.log("audioData",e),e?.indexOf&&e?.indexOf("http")>=-1)i=e;else{let o=new Blob([e],{type:"audio/wav"});i=URL.createObjectURL(o),this.uploadAndSaveVoice(o,t)}const s=AudioPlayer.getInstance();o?.onStart&&o?.onStart(t),s.setAudioEvent("onloadeddata",(()=>{let e=1e3*s.duration;console.log("duration",e),t?.get("duration")||(t?.set("duration",e),t?.save()),o?.onLoaded&&o?.onLoaded(s)})),console.log("event setting"),s.setAudioEvent("onabort",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onerror",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onpause",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onended",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onclose",(()=>{o?.onStop&&o?.onStop()}));let playAudio=()=>{s.play(i).then((()=>{})).catch((()=>{setTimeout((()=>{console.log("playAudio"),playAudio()}),200)}))};playAudio()}async uploadAndSaveVoice(e,t){if(this.uploadServ){let o=t?.id||this.uploadServ?.genMd5(t?.get("content")||t?.get("ssml")),i=new Date,s=o+i.getFullYear()+(i.getMonth()+1)+i.getDate()+i.getHours()+i.getMinutes()+i.getSeconds()+".wav",n=new File([e],s,{type:"audio/wav"}),r=await this.uploadServ.upload(n,(e=>{console.log(e)})),a={__type:"Pointer",className:"Attachment",objectId:r?.id};return a?.objectId&&(t.set("voiceFile",a),t=await t.save()),r?.url}return null}}
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3R0cy9mbW9kZS10dHMtY2xhc3MubWpz`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/login/auth.service.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{Injectable}from"@angular/core";import Parse from"parse";import{Router}from"@angular/router";import{NovaCloudService}from"../../nova-cloud";import{HttpClient}from"@angular/common/http";import{
|
|
8
|
+
import{Injectable}from"@angular/core";import Parse from"parse";import{Router}from"@angular/router";import{NovaCloudService}from"../../nova-cloud";import{HttpClient}from"@angular/common/http";import{ToastController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../nova-cloud";import*as i4 from"@angular/common/http";Parse.applicationId||(Parse.initialize("ncloudmaster"),Parse.serverURL=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+"parse");export class AuthService{isGuardLock(e){let t=!0,o=Parse.User.current();return t=!o?.id&&this.guardMap[e],t}get loginTypeCount(){return Object.values(this.loginOptions)?.filter((e=>e))?.length}get logoUrl(){return localStorage.getItem("LOGO_URL")||this._logoUrl||"https://file.yuban.co/img/logo-feima.png"}set logoUrl(e){localStorage.setItem("LOGO_URL",e),this._logoUrl=this._logoUrl}getCompanyId(){let e=localStorage.getItem("company");return e=this.company||e,e}constructor(e,t,o,r){this.router=e,this.toastCtrl=t,this.novaCloud=o,this.http=r,this.guardMap={},this.isModalShow=!1,this.showBackHome=!0,this.activeButton="账号密码",this.loginOptions={userpwd:!0,mobilepwd:!0,mobilecode:!0,wechat:!0},this._logoUrl="https://file.yuban.co/img/logo-feima.png",this.wechatUrl="https://file-cloud.fmode.cn/E4KpGvTEto/20230822/hv1tsm115258608.jpg",this.isLoggedIn=!1,this.LoginPage="/pcuser/login",this.mobileUserMap={},this.enabledLocalCode=!1}async toast(e){e.position=e?.position||"top",e.duration=e?.duration||1500,e.color=e?.color||"primary",(await this.toastCtrl.create(e)).present()}init(e){this.company=e.company,this.guardType=e.guardType,this.saveParamsInvite()}checkLoginLock(){let e=Parse.User.current();return!!e?.id||(this.isModalShow=!0,this.isLoggedIn=!1,!1)}checkLogin(e){this.guardMap[e]=!0;let t=Parse.User.current();return console.log("currentUser",t),t&&t.id?(this.setAccount(t),this.isLoggedIn=!0,!0):this.guardType&&"page"!=this.guardType?"modal"==this.guardType?(this.isModalShow=!0,this.isLoggedIn=!1,!0):void 0:(this.redirectUrl=e,this.router.navigate([this.LoginPage]),!1)}async setAccount(e){if(this.account?.id)return;let t=Parse.Object.extend("Account"),o=e?.get("company")||{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}||null,r=new Parse.Query("Account");r.equalTo("user",e.toPointer());let i=await r.first();return i?.id||(i=new t,i.set({user:e.toPointer(),company:o}),i=await i.save()),this.account=i,i}login(e,t){return new Promise(((o,r)=>{Parse.User.logIn(e,t).then((async e=>{if(this.bindInvite(e),this.setCurrentUserLocalStorage(e),"modal"==this.guardType)return await this.refreshPage(),void o(!0);let t=new Parse.Query("Company");t.select("rootPage"),t.equalTo("objectId",e?.get("company")?.id);let r=await t.first(),i=r?.get("rootPage");this.redirectUrl=this.redirectUrl||i||"/project/dashboard";let a=this.redirectUrl;a=decodeURIComponent(a),this.router.navigate([a])})).catch((e=>{console.error(e),r({message:"无此用户信息,请先在小程序登录"})}))}))}refreshPage(){return new Promise((e=>{let t=this.router.url;Parse.User.current()?.id&&(this.isModalShow=!1),this.router.navigateByUrl("/",{skipLocationChange:!0}).then((()=>{this.router.navigateByUrl(t).then((()=>{e(!0)}))}))}))}setCurrentUserLocalStorage(e){e.get("company")?.id&&localStorage.setItem("company",e.get("company")?.id)}logout(e,t){let o=localStorage.getItem("company"),r=localStorage.getItem("WECHAT_APP_ID"),i=localStorage.getItem("LOGO_URL"),a=localStorage.getItem("NOVA_APIG_SERVER");localStorage.clear(),localStorage.setItem("company",o),localStorage.setItem("WECHAT_APP_ID",r),localStorage.setItem("LOGO_URL",i),localStorage.setItem("NOVA_APIG_SERVER",a),Parse.User.logOut().then((e=>{})),this.router.navigate([t||"/pcuser/login"])}async loginMobilePassword(e,t,o){let r=await this.getMobileUser(e);r?this.login(r,t).then((async e=>{this.isModalShow=!1})).catch((e=>{console.log(e),o.create("error","错误的用户名或密码")})):o.create("error","用户不存在,请尝试其他登录方式")}signMobilePassword(e,t){return new Promise((async(o,r)=>{o(await this.signUpAndUpdate(e,t))}))}async getMobileUser(e){let t=this.getCompanyId(),o=t+e;if(this.mobileUserMap[o])return this.mobileUserMap[o];let r=await this.novaCloud.api("/auth/getusername",{company:t,mobile:e});return r?.username&&(this.mobileUserMap[o]=r?.username),this.mobileUserMap[o]}signUpAndUpdate(e,t){return t=t||e+"pwd666",new Promise((o=>{Parse.User.signUp(this.getCompanyId()+"-"+e,t,"").then((async t=>{t.id&&(console.log(t),t.set("company",{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}),t.set("mobile",e),t.set("type","user"),this.bindInvite(t),t=await t.save(),o(t))})).catch((e=>{o(void 0)}))}))}async getMobileCodeToken(e,t){return new Promise(((o,r)=>{let i=Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/";this.http.get(i+`api/auth/mobile?company=${this.company}&mobile=${e}&code=${t}`).toPromise().then((e=>{o(e)})).catch((e=>{r(e)}))}))}async loginCode(e,t,o,r){if(t)try{let o=await this.getMobileCodeToken(e,t);if(200==o?.code){console.log(200,o);let e=await Parse.User.become(o.data.token);if(console.log(e,e?.id),e?.id){console.log(e,e?.id);try{await this.bindInvite(e)}catch(e){console.error("bind err b",e)}return!0}}}catch(o){if(console.log("error1",o),!(o?.error?.mess?.indexOf("用户不存在")>-1))return void this.toast({message:o?.error?.mess});{let o=await this.signUpAndUpdate(e);if(o?.id)return await this.loginCode(e,t)}}else this.toast({color:"primary",message:"请填写有效验证码"})}saveParamsInvite(){let e=this.novaCloud.searchParse();console.log("saveParamsInvite",e);let t=e?.invite;console.log(t),t&&localStorage.setItem("invite",e?.invite)}async bindInvite(e){if(!(e=e||Parse.User.current()))return;if(e?.get("invite")?.id)return;let t,o=localStorage.getItem("invite");if(o&&e?.id!=o)try{t=await this.novaCloud.api("/auth/invite",{current:e?.id,invite:o,type:"code"}),console.log("bind",t)}catch(e){console.error("bind err",e)}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,deps:[{token:i1.Router},{token:i2.ToastController},{token:i3.NovaCloudService},{token:i4.HttpClient}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Router},{type:i2.ToastController},{type:i3.NovaCloudService},{type:i4.HttpClient}]});
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2F1dGguc2VydmljZS5tanM=`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{Component,HostListener,ViewChild,ElementRef}from"@angular/core";import{Router}from"@angular/router";import{AuthService}from"../login/auth.service";import{NzMessageService}from"ng-zorro-antd/message";import{HttpClient}from"@angular/common/http";import{CommonModule}from"@angular/common";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import Parse from"parse";import{IonCheckbox}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"ng-zorro-antd/message";import*as i2 from"../login/auth.service";import*as i3 from"@angular/router";import*as i4 from"@angular/common/http";import*as i5 from"@angular/forms";export class ModalUserLoginComponent{constructor(o,n,t,e){this.msg=o,this.authServ=n,this.router=t,this.http=e,this.isUserRuleChecked=!1,this.loginInfo={mobile:"",code:""},this.localCodeNum="",this.activeButton="账号密码",this.countdown=60,this.buttonText="获取验证码",this.isCountingdown=!1,this.drawCode=[]}ngOnInit(){this.close()}ngAfterViewInit(){}signMobilePassword(){this.mobile&&this.password?this.password==this.password2?this.authServ.signMobilePassword(this.mobile,this.password).then((o=>{o?.id&&this.setActiveButton("账号密码")})).catch((o=>{this.msg.error("注册失败,请更换手机号注册")})):this.msg.error("两次输入密码不同,请检查"):this.msg.error("请输入完整手机号和密码")}loginMobilePassword(){this.mobile&&this.password?this.authServ.loginMobilePassword(this.mobile,this.password,this.msg):this.msg.error("请输入完整手机号和密码")}close(){let o=this.authServ.isGuardLock(this.router.url);this.authServ.isModalShow=o}goHome(){let o=this.router.url;return o?.indexOf("yuban")&&this.router.navigateByUrl("/app/home"),o.indexOf("chat")>-1?(this.router.navigateByUrl("/chat/home"),void(this.authServ.isModalShow=!1)):o.indexOf("imagine")>-1?(this.router.navigateByUrl("/imagine/home"),void(this.authServ.isModalShow=!1)):(this.router.navigateByUrl("/"),void(this.authServ.isModalShow=!1))}handleEscapeKey(o){this.close()}setActiveButton(o){this.activeButton=o,console.log(this.activeButton),this.updateDrawCode()}startCountdown(){if(!String(this.loginInfo.mobile).match(/^1[3456789]\d{9}$/))return void this.msg.error("请填写正确手机号");let o=this.drawCode.join("");if(this.localCodeNum.toLowerCase()!=o.toLowerCase())return void this.msg.error("校验码不正确");let n=Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/";this.http.post(n+"api/apig/message",{company:this.authServ.company,mobile:this.loginInfo.mobile}).subscribe((o=>{console.log(o),this.msg.success("发送成功"),this.isCountingdown=!0,this.time(),this.updateDrawCode()}))}time(){this.isCountingdown=!0,this.buttonText=`${this.countdown}秒`;const o=setInterval((()=>{this.countdown--,this.buttonText=`${this.countdown}秒`,0===this.countdown&&(clearInterval(o),this.buttonText="重新发送",this.isCountingdown=!1)}),1e3)}async login(){String(this.loginInfo.mobile).match(/^1[3456789]\d{9}$/)?this.loginInfo.code?await this.authServ.loginCode(this.loginInfo.mobile,this.loginInfo.code,this.msg).then((o=>{console.log(o),this.close(),o&&(this.loginInfo={mobile:"",code:""},this.localCodeNum="",this.msg.success("登录成功"))})):this.msg.error("请输入短信验证码"):this.msg.error("请填写正确手机号")}updateDrawCode(){let o=100,n=document.getElementById("canvas");n&&this.canvasDom.nativeElement.removeChild(n),this.canvasDom.nativeElement;let t=document.createElement("canvas");t.width=100,t.height=44,t.className="canvas",t.setAttribute("id","canvas"),t.addEventListener("click",(()=>{this.updateDrawCode()}));let e=t.getContext("2d");t.width=o,t.height=44;let i="A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m".split(","),p=i.length;for(let o=0;o<=3;o++){let n=Math.floor(Math.random()*p),t=30*Math.random()*Math.PI/180,r=i[n];this.drawCode[o]=r;let a=10+20*o,s=20+8*Math.random();e.font="bold 23px 微软雅黑",e.translate(a,s),e.rotate(t),e.fillStyle=this.randomColor(),e.fillText(r,0,0),e.rotate(-t),e.translate(-a,-s)}for(let n=0;n<=5;n++)e.strokeStyle=this.randomColor(),e.beginPath(),e.moveTo(Math.random()*o,44*Math.random()),e.lineTo(Math.random()*o,44*Math.random()),e.stroke();for(let n=0;n<=30;n++){e.strokeStyle=this.randomColor(),e.beginPath();let n=Math.random()*o,t=44*Math.random();e.moveTo(n,t),e.lineTo(n+1,t+1),e.stroke()}this.canvasDom.nativeElement.appendChild(t)}randomColor(){return"rgb("+Math.floor(256*Math.random())+","+Math.floor(256*Math.random())+","+Math.floor(256*Math.random())+")"}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalUserLoginComponent,deps:[{token:i1.NzMessageService},{token:i2.AuthService},{token:i3.Router},{token:i4.HttpClient}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalUserLoginComponent,isStandalone:!0,selector:"fm-modal-user-login",host:{listeners:{"document:keydown.escape":"handleEscapeKey($event)"}},viewQueries:[{propertyName:"canvasDom",first:!0,predicate:["canvasDom"],descendants:!0}],ngImport:i0,template:'\x3c!--登录弹出框设置--\x3e\n\x3c!--背景灰色蒙版--\x3e\n<div\n class="popup"\n [style.display]="authServ.isModalShow ? \'block\' : \'none\'"\n (click)="close()"\n>\n <div class="popup-content" (click)="$event.stopPropagation()">\n <div class="popup-box">\n \x3c!--弹框内设置position:absolute,规范排版,后续只需position:relative增减内容--\x3e\n <div class="popup-box-content">\n <img\n class="logo-img-login"\n [src]="authServ.logoUrl"\n alt="fmode"\n />\n\n \x3c!--关闭图标按钮--\x3e\n <div class="close-icon-box">\n <div class="iconfont icon-shanchu2" (click)="close()"></div>\n </div>\n\n \x3c!--按钮切换登录方式--\x3e\n <div class="button-box">\n <div class="button-group">\n <button\n class="login-select-button"\n [class.active]="activeButton === \'账号密码\'"\n (click)="setActiveButton(\'账号密码\')"\n >\n 账号密码\n </button>\n <button\n class="login-select-button"\n [class.active]="activeButton === \'短信验证\'"\n (click)="setActiveButton(\'短信验证\')"\n >\n 短信验证\n </button>\n <button\n class="login-select-button"\n [class.active]="activeButton === \'微信扫码\'"\n (click)="setActiveButton(\'微信扫码\')"\n >\n 微信扫码\n </button>\n </div>\n </div>\n\n \x3c!--手机验证码--\x3e\n <form class="message-form" [class.active]="activeButton === \'短信验证\'">\n <div class="login-input-box">\n <div class="popup-input-frontnumber">+86</div>\n <input\n class="popup-input-itemone"\n type="text"\n required="required"\n [(ngModel)]="loginInfo.mobile"\n [ngModelOptions]="{ standalone: true }"\n maxlength="12"\n placeholder="请输入手机号"\n />\n </div>\n <div class="login-input-box local-code" #canvasDom>\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n [(ngModel)]="localCodeNum"\n [ngModelOptions]="{ standalone: true }"\n maxlength="4"\n placeholder="请输入校验码"\n />\n \x3c!-- <canvas\n #canvas\n width="100"\n height="44"\n (click)="updateDrawCode()"\n class="canvas"\n ></canvas> --\x3e\n </div>\n <div class="login-input-box">\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n placeholder="请输入短信验证码"\n [(ngModel)]="loginInfo.code"\n [ngModelOptions]="{ standalone: true }"\n maxlength="8"\n />\n <button\n class="checknumber-button"\n type="submit"\n [value]="buttonText"\n [disabled]="isCountingdown"\n (click)="startCountdown()"\n [class.active]="isCountingdown"\n >\n {{buttonText}}\n </button>\n </div>\n\n <div class="login-submit-box">\n <button class="login-submit-button" type="submit" (click)="login()">\n 登录\n </button>\n </div>\n </form>\n\n \x3c!--账号密码登录--\x3e\n <form class="mobile-form" [class.active]="activeButton === \'账号密码\'">\n <div class="login-input-box">\n <input\n maxlength="12"\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n \x3c!-- 记住密码 --\x3e\n <div class="passwprd-box">\n <div class="remember-password-box">\n <input type="checkbox" id="remember-password" />\n 记住密码\n </div>\n\n \x3c!-- 忘记密码 --\x3e\n <div class="password-forget" (click)="setActiveButton(\'注册帐号\')">\n 注册帐号\n </div>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>\n <input type="checkbox" [(ngModel)]="isUserRuleChecked" [ngModelOptions]="{ standalone: true }" style="margin-right:5px"/>\n <span (click)="isUserRuleChecked=true">同意</span></span>\n <span (click)="isUserRuleChecked=true">《用户协议及隐私条款》</span>\n </div>\n\n\n \x3c!-- 忘记密码 --\x3e\n \x3c!-- <div class="password-forget">忘记密码?</div>\n </div> --\x3e\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="loginMobilePassword()"\n >\n 登录\n </button>\n </div>\n </form>\n\n \x3c!-- 帐号密码注册 --\x3e\n <form class="mobile-form" [class.active]="activeButton === \'注册帐号\'">\n <div class="login-input-box">\n <input\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password2"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请再次输入密码"\n />\n </div>\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="signMobilePassword()"\n >\n 注册\n </button>\n </div>\n </form>\n\n \x3c!--微信扫码登陆--\x3e\n <form class="wechat-form" [class.active]="activeButton === \'微信扫码\'">\n <div class="wechat-login-box">\n <img\n class="login-erweima-img"\n [src]="authServ.wechatUrl"\n alt="微信扫码登陆二维码"\n />\n </div>\n <div class="wechat-explain">使用微信扫一扫,扫码登录 "飞码AI"</div>\n </form>\n\n \x3c!--返回首页--\x3e\n <div class="back-home-box">\n <button class="back-homepage-button" (click)="goHome()">\n 返回首页\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n',styles:['@charset "UTF-8";:host{--fmode-color-primary: #0199f9;--fmode-background-primary: #FFF}:host-context(body.dark) .popup{--fmode-color-primary: #7974ff;--fmode-background-primary: #000000}:host-context(body.dark) .popup .remember-password-box{color:#fff}.popup{display:flex;position:fixed;left:0;top:0;width:100%;height:100%;background-color:#0006;z-index:10000}@media screen and (max-width: 800px){.popup-content .popup-box{position:fixed!important;left:0!important;top:0!important;height:100vh!important;width:100vw!important;border-radius:0!important}.popup-content .popup-box .popup-box-content{border-radius:50px!important}}.popup-content{margin:7% auto;display:flex;width:500px;height:600px;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .popup-box{width:500px;height:600px;position:relative;border-radius:50px 5px;background-color:#1e90ff;overflow:hidden}.popup-content .popup-box .popup-box-content{position:absolute;border-radius:50px 5px;inset:4px;background-color:var(--fmode-background-primary);z-index:1}.popup-content .popup-box .popup-box-content .logo-img-login{margin-top:35px;position:relative;height:82px;width:60%;left:20%;z-index:2}.popup-content .popup-box .popup-box-content .close-icon-box{position:relative;top:20px;right:20px;float:right;font-size:20px;cursor:pointer;z-index:2}.popup-content .popup-box .popup-box-content .button-box{display:flex;justify-content:center;padding-top:32px;padding-right:59px;padding-left:59px;border-radius:10px;width:100%;height:72px}.popup-content .popup-box .popup-box-content .button-box .button-group{position:relative;display:flex;width:100%;line-height:40px;border-radius:10px;background-color:plum;z-index:2}.popup-content .popup-box .popup-box-content .button-box .login-select-button{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#fff;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button:hover{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#000;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button.active{background-color:var(--fmode-color-primary);border-radius:10px}.popup-content .popup-box .popup-box-content input{color:#000}.popup-content .popup-box .popup-box-content .message-form,.popup-content .popup-box .popup-box-content .mobile-form,.popup-content .popup-box .popup-box-content .wechat-form{display:none}.popup-content .popup-box .popup-box-content .message-form.active,.popup-content .popup-box .popup-box-content .mobile-form.active,.popup-content .popup-box .popup-box-content .wechat-form.active{display:block}.popup-content .popup-box:before{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#f902ff,#f902ff);transform-origin:bottom right;animation:animate 6s linear infinite}.popup-content .popup-box:after{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#00dbde,#00dbde);transform-origin:bottom right;animation:animate 6s linear infinite;animation-delay:-3s}@keyframes animate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.popup-content .login-submit-box{position:relative}.popup-content .login-submit-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .login-submit-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .login-submit-button:hover{color:var(--fmode-color-primary)}.popup-content .login-submit-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .login-submit-button:active{transform:scale(.9)}.popup-content .message-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .message-form .login-input-box{display:flex;align-items:center;padding-top:10px}.popup-content .message-form .login-input-box .popup-input-frontnumber{padding:6px 12px;position:relative;border-radius:10px 0 0 10px;line-height:40px;font-size:18px;color:#4d4d4d;background-color:#ededed}.popup-content .message-form .popup-input-itemone{padding:6px 12px;position:relative;line-height:40px;border-radius:0 10px 10px 0;border:0;width:93%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .popup-input-itemtwo{padding:6px 12px 6px 16px;position:relative;line-height:40px;border-radius:10px;border:0;width:55%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .checknumber-button{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;color:#fff;background:var(--fmode-color-primary)}.popup-content .message-form .checknumber-button:hover{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;background:#4bace9}.popup-content .message-form .checknumber-button.active{background:#c7c7c7}.popup-content .mobile-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .mobile-form .login-input-box{padding-top:10px}.popup-content .mobile-form .login-input-box .popup-input-itemnomal{margin-top:20px;padding:6px 12px 6px 14px;position:relative;line-height:40px;border-radius:10px;border:0;width:100%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .mobile-form .rule-box{display:flex;padding-top:4px;padding-left:15px;padding-right:10px;justify-content:space-between;font-size:15px}.popup-content .mobile-form .rule-box span,.popup-content .mobile-form .rule-box ion-checkbox{font-size:15px;color:var(--fmode-color-primary)}.popup-content .mobile-form .passwprd-box{display:flex;padding-top:4px;justify-content:space-between}.popup-content .mobile-form .passwprd-box .remember-password-box{margin:10px 0 0 15px;font-size:15px}.popup-content .mobile-form .passwprd-box .password-forget{margin-top:10px;margin-right:15px;font-size:15px;color:gray;cursor:pointer}.popup-content .mobile-form .passwprd-box .password-forget:hover{margin-top:10px;margin-right:15px;font-size:15px;color:#000;cursor:pointer}.popup-content .wechat-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .wechat-form .wechat-login-box{display:flex;justify-content:center}.popup-content .wechat-form .wechat-login-box .login-erweima-img{margin-top:30px;width:210px}.popup-content .wechat-form .wechat-explain{padding-top:20px;font-size:16px;text-align:center}.popup-content .back-home-box{display:flex;justify-content:center;padding:6px 55px}.popup-content .back-homepage-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .back-homepage-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .back-homepage-button:hover{color:var(--fmode-color-primary)}.popup-content .back-homepage-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .local-code{justify-content:space-between}.popup-content .local-code .canvas{border:1px solid #c2def5;border-radius:5px;width:100px;height:44px}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i5.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i5.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i5.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i5.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i5.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i5.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:i5.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i5.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"directive",type:i5.NgForm,selector:"form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]",inputs:["ngFormOptions"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"ngmodule",type:ReactiveFormsModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalUserLoginComponent,decorators:[{type:Component,args:[{standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,IonCheckbox],selector:"fm-modal-user-login",template:'\x3c!--登录弹出框设置--\x3e\n\x3c!--背景灰色蒙版--\x3e\n<div\n class="popup"\n [style.display]="authServ.isModalShow ? \'block\' : \'none\'"\n (click)="close()"\n>\n <div class="popup-content" (click)="$event.stopPropagation()">\n <div class="popup-box">\n \x3c!--弹框内设置position:absolute,规范排版,后续只需position:relative增减内容--\x3e\n <div class="popup-box-content">\n <img\n class="logo-img-login"\n [src]="authServ.logoUrl"\n alt="fmode"\n />\n\n \x3c!--关闭图标按钮--\x3e\n <div class="close-icon-box">\n <div class="iconfont icon-shanchu2" (click)="close()"></div>\n </div>\n\n \x3c!--按钮切换登录方式--\x3e\n <div class="button-box">\n <div class="button-group">\n <button\n class="login-select-button"\n [class.active]="activeButton === \'账号密码\'"\n (click)="setActiveButton(\'账号密码\')"\n >\n 账号密码\n </button>\n <button\n class="login-select-button"\n [class.active]="activeButton === \'短信验证\'"\n (click)="setActiveButton(\'短信验证\')"\n >\n 短信验证\n </button>\n <button\n class="login-select-button"\n [class.active]="activeButton === \'微信扫码\'"\n (click)="setActiveButton(\'微信扫码\')"\n >\n 微信扫码\n </button>\n </div>\n </div>\n\n \x3c!--手机验证码--\x3e\n <form class="message-form" [class.active]="activeButton === \'短信验证\'">\n <div class="login-input-box">\n <div class="popup-input-frontnumber">+86</div>\n <input\n class="popup-input-itemone"\n type="text"\n required="required"\n [(ngModel)]="loginInfo.mobile"\n [ngModelOptions]="{ standalone: true }"\n maxlength="12"\n placeholder="请输入手机号"\n />\n </div>\n <div class="login-input-box local-code" #canvasDom>\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n [(ngModel)]="localCodeNum"\n [ngModelOptions]="{ standalone: true }"\n maxlength="4"\n placeholder="请输入校验码"\n />\n \x3c!-- <canvas\n #canvas\n width="100"\n height="44"\n (click)="updateDrawCode()"\n class="canvas"\n ></canvas> --\x3e\n </div>\n <div class="login-input-box">\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n placeholder="请输入短信验证码"\n [(ngModel)]="loginInfo.code"\n [ngModelOptions]="{ standalone: true }"\n maxlength="8"\n />\n <button\n class="checknumber-button"\n type="submit"\n [value]="buttonText"\n [disabled]="isCountingdown"\n (click)="startCountdown()"\n [class.active]="isCountingdown"\n >\n {{buttonText}}\n </button>\n </div>\n\n <div class="login-submit-box">\n <button class="login-submit-button" type="submit" (click)="login()">\n 登录\n </button>\n </div>\n </form>\n\n \x3c!--账号密码登录--\x3e\n <form class="mobile-form" [class.active]="activeButton === \'账号密码\'">\n <div class="login-input-box">\n <input\n maxlength="12"\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n \x3c!-- 记住密码 --\x3e\n <div class="passwprd-box">\n <div class="remember-password-box">\n <input type="checkbox" id="remember-password" />\n 记住密码\n </div>\n\n \x3c!-- 忘记密码 --\x3e\n <div class="password-forget" (click)="setActiveButton(\'注册帐号\')">\n 注册帐号\n </div>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>\n <input type="checkbox" [(ngModel)]="isUserRuleChecked" [ngModelOptions]="{ standalone: true }" style="margin-right:5px"/>\n <span (click)="isUserRuleChecked=true">同意</span></span>\n <span (click)="isUserRuleChecked=true">《用户协议及隐私条款》</span>\n </div>\n\n\n \x3c!-- 忘记密码 --\x3e\n \x3c!-- <div class="password-forget">忘记密码?</div>\n </div> --\x3e\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="loginMobilePassword()"\n >\n 登录\n </button>\n </div>\n </form>\n\n \x3c!-- 帐号密码注册 --\x3e\n <form class="mobile-form" [class.active]="activeButton === \'注册帐号\'">\n <div class="login-input-box">\n <input\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password2"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请再次输入密码"\n />\n </div>\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="signMobilePassword()"\n >\n 注册\n </button>\n </div>\n </form>\n\n \x3c!--微信扫码登陆--\x3e\n <form class="wechat-form" [class.active]="activeButton === \'微信扫码\'">\n <div class="wechat-login-box">\n <img\n class="login-erweima-img"\n [src]="authServ.wechatUrl"\n alt="微信扫码登陆二维码"\n />\n </div>\n <div class="wechat-explain">使用微信扫一扫,扫码登录 "飞码AI"</div>\n </form>\n\n \x3c!--返回首页--\x3e\n <div class="back-home-box">\n <button class="back-homepage-button" (click)="goHome()">\n 返回首页\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n',styles:['@charset "UTF-8";:host{--fmode-color-primary: #0199f9;--fmode-background-primary: #FFF}:host-context(body.dark) .popup{--fmode-color-primary: #7974ff;--fmode-background-primary: #000000}:host-context(body.dark) .popup .remember-password-box{color:#fff}.popup{display:flex;position:fixed;left:0;top:0;width:100%;height:100%;background-color:#0006;z-index:10000}@media screen and (max-width: 800px){.popup-content .popup-box{position:fixed!important;left:0!important;top:0!important;height:100vh!important;width:100vw!important;border-radius:0!important}.popup-content .popup-box .popup-box-content{border-radius:50px!important}}.popup-content{margin:7% auto;display:flex;width:500px;height:600px;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .popup-box{width:500px;height:600px;position:relative;border-radius:50px 5px;background-color:#1e90ff;overflow:hidden}.popup-content .popup-box .popup-box-content{position:absolute;border-radius:50px 5px;inset:4px;background-color:var(--fmode-background-primary);z-index:1}.popup-content .popup-box .popup-box-content .logo-img-login{margin-top:35px;position:relative;height:82px;width:60%;left:20%;z-index:2}.popup-content .popup-box .popup-box-content .close-icon-box{position:relative;top:20px;right:20px;float:right;font-size:20px;cursor:pointer;z-index:2}.popup-content .popup-box .popup-box-content .button-box{display:flex;justify-content:center;padding-top:32px;padding-right:59px;padding-left:59px;border-radius:10px;width:100%;height:72px}.popup-content .popup-box .popup-box-content .button-box .button-group{position:relative;display:flex;width:100%;line-height:40px;border-radius:10px;background-color:plum;z-index:2}.popup-content .popup-box .popup-box-content .button-box .login-select-button{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#fff;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button:hover{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#000;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button.active{background-color:var(--fmode-color-primary);border-radius:10px}.popup-content .popup-box .popup-box-content input{color:#000}.popup-content .popup-box .popup-box-content .message-form,.popup-content .popup-box .popup-box-content .mobile-form,.popup-content .popup-box .popup-box-content .wechat-form{display:none}.popup-content .popup-box .popup-box-content .message-form.active,.popup-content .popup-box .popup-box-content .mobile-form.active,.popup-content .popup-box .popup-box-content .wechat-form.active{display:block}.popup-content .popup-box:before{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#f902ff,#f902ff);transform-origin:bottom right;animation:animate 6s linear infinite}.popup-content .popup-box:after{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#00dbde,#00dbde);transform-origin:bottom right;animation:animate 6s linear infinite;animation-delay:-3s}@keyframes animate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.popup-content .login-submit-box{position:relative}.popup-content .login-submit-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .login-submit-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .login-submit-button:hover{color:var(--fmode-color-primary)}.popup-content .login-submit-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .login-submit-button:active{transform:scale(.9)}.popup-content .message-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .message-form .login-input-box{display:flex;align-items:center;padding-top:10px}.popup-content .message-form .login-input-box .popup-input-frontnumber{padding:6px 12px;position:relative;border-radius:10px 0 0 10px;line-height:40px;font-size:18px;color:#4d4d4d;background-color:#ededed}.popup-content .message-form .popup-input-itemone{padding:6px 12px;position:relative;line-height:40px;border-radius:0 10px 10px 0;border:0;width:93%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .popup-input-itemtwo{padding:6px 12px 6px 16px;position:relative;line-height:40px;border-radius:10px;border:0;width:55%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .checknumber-button{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;color:#fff;background:var(--fmode-color-primary)}.popup-content .message-form .checknumber-button:hover{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;background:#4bace9}.popup-content .message-form .checknumber-button.active{background:#c7c7c7}.popup-content .mobile-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .mobile-form .login-input-box{padding-top:10px}.popup-content .mobile-form .login-input-box .popup-input-itemnomal{margin-top:20px;padding:6px 12px 6px 14px;position:relative;line-height:40px;border-radius:10px;border:0;width:100%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .mobile-form .rule-box{display:flex;padding-top:4px;padding-left:15px;padding-right:10px;justify-content:space-between;font-size:15px}.popup-content .mobile-form .rule-box span,.popup-content .mobile-form .rule-box ion-checkbox{font-size:15px;color:var(--fmode-color-primary)}.popup-content .mobile-form .passwprd-box{display:flex;padding-top:4px;justify-content:space-between}.popup-content .mobile-form .passwprd-box .remember-password-box{margin:10px 0 0 15px;font-size:15px}.popup-content .mobile-form .passwprd-box .password-forget{margin-top:10px;margin-right:15px;font-size:15px;color:gray;cursor:pointer}.popup-content .mobile-form .passwprd-box .password-forget:hover{margin-top:10px;margin-right:15px;font-size:15px;color:#000;cursor:pointer}.popup-content .wechat-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .wechat-form .wechat-login-box{display:flex;justify-content:center}.popup-content .wechat-form .wechat-login-box .login-erweima-img{margin-top:30px;width:210px}.popup-content .wechat-form .wechat-explain{padding-top:20px;font-size:16px;text-align:center}.popup-content .back-home-box{display:flex;justify-content:center;padding:6px 55px}.popup-content .back-homepage-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .back-homepage-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .back-homepage-button:hover{color:var(--fmode-color-primary)}.popup-content .back-homepage-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .local-code{justify-content:space-between}.popup-content .local-code .canvas{border:1px solid #c2def5;border-radius:5px;width:100px;height:44px}\n']}]}],ctorParameters:()=>[{type:i1.NzMessageService},{type:i2.AuthService},{type:i3.Router},{type:i4.HttpClient}],propDecorators:{canvasDom:[{type:ViewChild,args:["canvasDom"]}],handleEscapeKey:[{type:HostListener,args:["document:keydown.escape",["$event"]]}]}});
|
|
8
|
+
import{Component,HostListener,ViewChild,ElementRef}from"@angular/core";import{Router}from"@angular/router";import{AuthService}from"../login/auth.service";import{NzMessageService}from"ng-zorro-antd/message";import{HttpClient}from"@angular/common/http";import{CommonModule}from"@angular/common";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import Parse from"parse";import{IonCheckbox,ToastController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"ng-zorro-antd/message";import*as i2 from"../login/auth.service";import*as i3 from"@angular/router";import*as i4 from"@angular/common/http";import*as i5 from"@ionic/angular/standalone";import*as i6 from"@angular/common";import*as i7 from"@angular/forms";export class ModalUserLoginComponent{constructor(o,n,t,e,i){this.msg=o,this.authServ=n,this.router=t,this.http=e,this.toastCtrl=i,this.isUserRuleChecked=!1,this.loginInfo={mobile:"",code:""},this.localCodeNum="",this.countdown=60,this.buttonText="获取验证码",this.isCountingdown=!1,this.drawCode=[]}ngOnInit(){this.close()}ngAfterViewInit(){this.setActiveButton(this.authServ.activeButton)}signMobilePassword(){this.mobile&&this.password?this.password==this.password2?this.authServ.signMobilePassword(this.mobile,this.password).then((o=>{o?.id&&this.setActiveButton("账号密码")})).catch((o=>{this.msg.error("注册失败,请更换手机号注册")})):this.msg.error("两次输入密码不同,请检查"):this.msg.error("请输入完整手机号和密码")}loginMobilePassword(){this.mobile&&this.password?this.authServ.loginMobilePassword(this.mobile,this.password,this.msg):this.msg.error("请输入完整手机号和密码")}close(){let o=this.authServ.isGuardLock(this.router.url);this.authServ.isModalShow=o}goHome(){let o=this.router.url;return o?.indexOf("yuban")&&this.router.navigateByUrl("/app/home"),o.indexOf("chat")>-1?(this.router.navigateByUrl("/chat/home"),void(this.authServ.isModalShow=!1)):o.indexOf("imagine")>-1?(this.router.navigateByUrl("/imagine/home"),void(this.authServ.isModalShow=!1)):(this.router.navigateByUrl("/"),void(this.authServ.isModalShow=!1))}handleEscapeKey(o){this.close()}setActiveButton(o){this.authServ.activeButton=o,console.log(this.authServ.activeButton),this.updateDrawCode()}startCountdown(){if(!String(this.loginInfo.mobile).match(/^1[3456789]\d{9}$/))return void this.msg.error("请填写正确手机号");let o=this.drawCode.join("");if(this.authServ.enabledLocalCode&&this.localCodeNum.toLowerCase()!=o.toLowerCase())return void this.msg.error("校验码不正确");let n=Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/";this.http.post(n+"api/apig/message",{company:this.authServ.company,mobile:this.loginInfo.mobile}).subscribe((o=>{console.log(o),this.msg.success("发送成功"),this.isCountingdown=!0,this.time(),this.updateDrawCode()}))}time(){this.isCountingdown=!0,this.buttonText=`${this.countdown}秒`;let o=setInterval((()=>{this.countdown--,this.buttonText=`${this.countdown}秒`,(0===this.countdown||this.countdown<0)&&(clearInterval(o),this.buttonText="重新发送",this.isCountingdown=!1,this.countdown=0)}),1e3)}async login(){let o;if(!String(this.loginInfo.mobile).match(/^1[3456789]\d{9}$/))return void this.msg.error("请填写正确手机号");if(!this.loginInfo.code)return void this.msg.error("请输入短信验证码");try{o=await this.authServ.loginCode(this.loginInfo.mobile,this.loginInfo.code,this.msg)}catch(o){}let n=Parse.User.current();(o||n?.id)&&(console.log(o,n?.id,"close"),this.close(),this.loginInfo={mobile:"",code:""},this.localCodeNum="",this.toast({color:"success",message:"登录成功"}))}async toast(o){o.position=o?.position||"top",o.duration=o?.duration||1500,o.color=o?.color||"primary",(await this.toastCtrl.create(o)).present()}updateDrawCode(){if(!this.authServ.enabledLocalCode)return;let o=100,n=document.getElementById("canvas");n&&this.canvasDom.nativeElement.removeChild(n),this.canvasDom.nativeElement;let t=document.createElement("canvas");t.width=100,t.height=44,t.className="canvas",t.setAttribute("id","canvas"),t.addEventListener("click",(()=>{this.updateDrawCode()}));let e=t.getContext("2d");t.width=o,t.height=44;let i="A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m".split(","),p=i.length;for(let o=0;o<=3;o++){let n=Math.floor(Math.random()*p),t=30*Math.random()*Math.PI/180,r=i[n];this.drawCode[o]=r;let a=10+20*o,s=20+8*Math.random();e.font="bold 23px 微软雅黑",e.translate(a,s),e.rotate(t),e.fillStyle=this.randomColor(),e.fillText(r,0,0),e.rotate(-t),e.translate(-a,-s)}for(let n=0;n<=5;n++)e.strokeStyle=this.randomColor(),e.beginPath(),e.moveTo(Math.random()*o,44*Math.random()),e.lineTo(Math.random()*o,44*Math.random()),e.stroke();for(let n=0;n<=30;n++){e.strokeStyle=this.randomColor(),e.beginPath();let n=Math.random()*o,t=44*Math.random();e.moveTo(n,t),e.lineTo(n+1,t+1),e.stroke()}this.canvasDom.nativeElement.appendChild(t)}randomColor(){return"rgb("+Math.floor(256*Math.random())+","+Math.floor(256*Math.random())+","+Math.floor(256*Math.random())+")"}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalUserLoginComponent,deps:[{token:i1.NzMessageService},{token:i2.AuthService},{token:i3.Router},{token:i4.HttpClient},{token:i5.ToastController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalUserLoginComponent,isStandalone:!0,selector:"fm-modal-user-login",host:{listeners:{"document:keydown.escape":"handleEscapeKey($event)"}},viewQueries:[{propertyName:"canvasDom",first:!0,predicate:["canvasDom"],descendants:!0}],ngImport:i0,template:'\x3c!--登录弹出框设置--\x3e\n\x3c!--背景灰色蒙版--\x3e\n<div\n class="popup"\n [style.display]="authServ.isModalShow ? \'block\' : \'none\'"\n (click)="close()"\n>\n <div class="popup-content" (click)="$event.stopPropagation()">\n <div class="popup-box">\n \x3c!--弹框内设置position:absolute,规范排版,后续只需position:relative增减内容--\x3e\n <div class="popup-box-content">\n <div class="logo-img-login">\n <img\n [src]="authServ.logoUrl"\n alt="fmode"\n />\n </div>\n\n \x3c!--关闭图标按钮--\x3e\n <div class="close-icon-box">\n <div class="iconfont icon-shanchu2" (click)="close()"></div>\n </div>\n\n \x3c!--按钮切换登录方式--\x3e\n <div class="button-box" *ngIf="authServ?.loginTypeCount>1">\n <div class="button-group">\n <button *ngIf="authServ?.loginOptions?.userpwd"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'账号密码\'"\n (click)="setActiveButton(\'账号密码\')"\n >\n 账号密码\n </button>\n <button *ngIf="authServ?.loginOptions?.mobilecode"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'短信验证\'"\n (click)="setActiveButton(\'短信验证\')"\n >\n 短信验证\n </button>\n <button *ngIf="authServ?.loginOptions?.wechat"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'微信扫码\'"\n (click)="setActiveButton(\'微信扫码\')"\n >\n 微信扫码\n </button>\n </div>\n </div>\n\n \x3c!--手机验证码--\x3e\n <form class="message-form" [class.active]="authServ.activeButton === \'短信验证\'" *ngIf="authServ?.loginOptions?.mobilecode">\n <div class="login-input-box">\n <div class="popup-input-frontnumber">+86</div>\n <input\n class="popup-input-itemone"\n type="text"\n required="required"\n [(ngModel)]="loginInfo.mobile"\n [ngModelOptions]="{ standalone: true }"\n maxlength="12"\n placeholder="请输入手机号"\n />\n </div>\n <div *ngIf="authServ?.enabledLocalCode"\n class="login-input-box local-code" #canvasDom>\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n [(ngModel)]="localCodeNum"\n [ngModelOptions]="{ standalone: true }"\n maxlength="4"\n placeholder="请输入校验码"\n />\n \x3c!-- <canvas\n #canvas\n width="100"\n height="44"\n (click)="updateDrawCode()"\n class="canvas"\n ></canvas> --\x3e\n </div>\n <div class="login-input-box">\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n placeholder="请输入短信验证码"\n [(ngModel)]="loginInfo.code"\n [ngModelOptions]="{ standalone: true }"\n maxlength="8"\n />\n <button\n class="checknumber-button"\n type="submit"\n [value]="buttonText"\n [disabled]="isCountingdown"\n (click)="startCountdown()"\n [class.active]="isCountingdown"\n >\n {{buttonText}}\n </button>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>未注册的手机号,将自动创建帐号并登录。</span>\n </div>\n\n <div class="login-submit-box">\n <button class="login-submit-button" type="submit" (click)="login()">\n 登录\n </button>\n </div>\n </form>\n\n \x3c!--账号密码登录--\x3e\n <form class="mobile-form" [class.active]="authServ.activeButton === \'账号密码\'" *ngIf="authServ?.loginOptions?.userpwd">\n <div class="login-input-box">\n <input\n maxlength="12"\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n \x3c!-- 记住密码 --\x3e\n <div class="passwprd-box">\n <div class="remember-password-box">\n <input type="checkbox" id="remember-password" />\n 记住密码\n </div>\n\n \x3c!-- 忘记密码 --\x3e\n <div class="password-forget" (click)="setActiveButton(\'注册帐号\')">\n 注册帐号\n </div>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>\n <input type="checkbox" [(ngModel)]="isUserRuleChecked" [ngModelOptions]="{ standalone: true }" style="margin-right:5px"/>\n <span (click)="isUserRuleChecked=true">同意</span></span>\n <span (click)="isUserRuleChecked=true">《用户协议及隐私条款》</span>\n </div>\n\n\n \x3c!-- 忘记密码 --\x3e\n \x3c!-- <div class="password-forget">忘记密码?</div>\n </div> --\x3e\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="loginMobilePassword()"\n >\n 登录\n </button>\n </div>\n </form>\n\n \x3c!-- 帐号密码注册 --\x3e\n <form class="mobile-form" [class.active]="authServ.activeButton === \'注册帐号\'">\n <div class="login-input-box">\n <input\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password2"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请再次输入密码"\n />\n </div>\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="signMobilePassword()"\n >\n 注册\n </button>\n </div>\n </form>\n\n \x3c!--微信扫码登陆--\x3e\n <form class="wechat-form" [class.active]="authServ.activeButton === \'微信扫码\'" *ngIf="authServ?.loginOptions?.wechat">\n <div class="wechat-login-box">\n <img\n class="login-erweima-img"\n [src]="authServ.wechatUrl"\n alt="微信扫码登陆二维码"\n />\n </div>\n <div class="wechat-explain">使用微信扫一扫,扫码登录 "飞码AI"</div>\n </form>\n\n \x3c!--返回首页--\x3e\n <div class="back-home-box" *ngIf="authServ.showBackHome">\n <button class="back-homepage-button" (click)="goHome()">\n 返回首页\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n',styles:['@charset "UTF-8";:host{--fmode-color-primary: #0199f9;--fmode-background-primary: #FFF}:host-context(body.dark) .popup{--fmode-color-primary: #7974ff;--fmode-background-primary: #000000}:host-context(body.dark) .popup .remember-password-box{color:#fff}.popup{display:flex;position:fixed;left:0;top:0;width:100%;height:100%;background-color:#0006;z-index:10000}@media screen and (max-width: 800px){.popup-content .popup-box{position:fixed!important;left:0!important;top:0!important;height:100vh!important;width:100vw!important;border-radius:0!important}.popup-content .popup-box .popup-box-content{border-radius:50px!important}}.popup-content{margin:7% auto;display:flex;width:500px;height:600px;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .popup-box{width:500px;height:600px;position:relative;border-radius:50px 5px;background-color:#1e90ff;overflow:hidden}.popup-content .popup-box .popup-box-content{position:absolute;border-radius:50px 5px;inset:4px;background-color:var(--fmode-background-primary);z-index:1}.popup-content .popup-box .popup-box-content .logo-img-login{margin-top:35px;position:relative;width:100%;display:flex;justify-content:center;z-index:2}.popup-content .popup-box .popup-box-content .logo-img-login img{height:auto;max-width:150px}.popup-content .popup-box .popup-box-content .close-icon-box{position:relative;top:20px;right:20px;float:right;font-size:20px;cursor:pointer;z-index:2}.popup-content .popup-box .popup-box-content .button-box{display:flex;justify-content:center;padding-top:32px;padding-right:59px;padding-left:59px;border-radius:10px;width:100%;height:72px}.popup-content .popup-box .popup-box-content .button-box .button-group{position:relative;display:flex;width:100%;line-height:40px;border-radius:10px;background-color:plum;z-index:2}.popup-content .popup-box .popup-box-content .button-box .login-select-button{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#fff;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button:hover{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#000;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button.active{background-color:var(--fmode-color-primary);border-radius:10px}.popup-content .popup-box .popup-box-content input{color:#000}.popup-content .popup-box .popup-box-content .message-form,.popup-content .popup-box .popup-box-content .mobile-form,.popup-content .popup-box .popup-box-content .wechat-form{display:none}.popup-content .popup-box .popup-box-content .message-form.active,.popup-content .popup-box .popup-box-content .mobile-form.active,.popup-content .popup-box .popup-box-content .wechat-form.active{display:block}.popup-content .popup-box:before{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#f902ff,#f902ff);transform-origin:bottom right;animation:animate 6s linear infinite}.popup-content .popup-box:after{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#00dbde,#00dbde);transform-origin:bottom right;animation:animate 6s linear infinite;animation-delay:-3s}@keyframes animate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.popup-content .login-submit-box{position:relative}.popup-content .login-submit-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .login-submit-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .login-submit-button:hover{color:var(--fmode-color-primary)}.popup-content .login-submit-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .login-submit-button:active{transform:scale(.9)}.popup-content .message-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .message-form .login-input-box{display:flex;align-items:center;padding-top:10px}.popup-content .message-form .login-input-box .popup-input-frontnumber{padding:6px 12px;position:relative;border-radius:10px 0 0 10px;line-height:40px;font-size:18px;color:#4d4d4d;background-color:#ededed}.popup-content .message-form .popup-input-itemone{padding:6px 12px;position:relative;line-height:40px;border-radius:0 10px 10px 0;border:0;width:93%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .popup-input-itemtwo{padding:6px 12px 6px 16px;position:relative;line-height:40px;border-radius:10px;border:0;width:55%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .checknumber-button{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;color:#fff;background:var(--fmode-color-primary)}.popup-content .message-form .checknumber-button:hover{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;background:#4bace9}.popup-content .message-form .checknumber-button.active{background:#c7c7c7}.popup-content .mobile-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .mobile-form .login-input-box{padding-top:10px}.popup-content .mobile-form .login-input-box .popup-input-itemnomal{margin-top:20px;padding:6px 12px 6px 14px;position:relative;line-height:40px;border-radius:10px;border:0;width:100%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .mobile-form .rule-box{display:flex;padding-top:4px;padding-left:15px;padding-right:10px;justify-content:space-between;font-size:15px}.popup-content .mobile-form .rule-box span,.popup-content .mobile-form .rule-box ion-checkbox{font-size:15px;color:var(--fmode-color-primary)}.popup-content .mobile-form .passwprd-box{display:flex;padding-top:4px;justify-content:space-between}.popup-content .mobile-form .passwprd-box .remember-password-box{margin:10px 0 0 15px;font-size:15px}.popup-content .mobile-form .passwprd-box .password-forget{margin-top:10px;margin-right:15px;font-size:15px;color:gray;cursor:pointer}.popup-content .mobile-form .passwprd-box .password-forget:hover{margin-top:10px;margin-right:15px;font-size:15px;color:#000;cursor:pointer}.popup-content .wechat-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .wechat-form .wechat-login-box{display:flex;justify-content:center}.popup-content .wechat-form .wechat-login-box .login-erweima-img{margin-top:30px;width:210px}.popup-content .wechat-form .wechat-explain{padding-top:20px;font-size:16px;text-align:center}.popup-content .back-home-box{display:flex;justify-content:center;padding:6px 55px}.popup-content .back-homepage-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .back-homepage-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .back-homepage-button:hover{color:var(--fmode-color-primary)}.popup-content .back-homepage-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .local-code{justify-content:space-between}.popup-content .local-code .canvas{border:1px solid #c2def5;border-radius:5px;width:100px;height:44px}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i7.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i7.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i7.CheckboxControlValueAccessor,selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]"},{kind:"directive",type:i7.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i7.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i7.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:i7.MaxLengthValidator,selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",inputs:["maxlength"]},{kind:"directive",type:i7.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"directive",type:i7.NgForm,selector:"form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]",inputs:["ngFormOptions"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"ngmodule",type:ReactiveFormsModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalUserLoginComponent,decorators:[{type:Component,args:[{standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,IonCheckbox],selector:"fm-modal-user-login",template:'\x3c!--登录弹出框设置--\x3e\n\x3c!--背景灰色蒙版--\x3e\n<div\n class="popup"\n [style.display]="authServ.isModalShow ? \'block\' : \'none\'"\n (click)="close()"\n>\n <div class="popup-content" (click)="$event.stopPropagation()">\n <div class="popup-box">\n \x3c!--弹框内设置position:absolute,规范排版,后续只需position:relative增减内容--\x3e\n <div class="popup-box-content">\n <div class="logo-img-login">\n <img\n [src]="authServ.logoUrl"\n alt="fmode"\n />\n </div>\n\n \x3c!--关闭图标按钮--\x3e\n <div class="close-icon-box">\n <div class="iconfont icon-shanchu2" (click)="close()"></div>\n </div>\n\n \x3c!--按钮切换登录方式--\x3e\n <div class="button-box" *ngIf="authServ?.loginTypeCount>1">\n <div class="button-group">\n <button *ngIf="authServ?.loginOptions?.userpwd"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'账号密码\'"\n (click)="setActiveButton(\'账号密码\')"\n >\n 账号密码\n </button>\n <button *ngIf="authServ?.loginOptions?.mobilecode"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'短信验证\'"\n (click)="setActiveButton(\'短信验证\')"\n >\n 短信验证\n </button>\n <button *ngIf="authServ?.loginOptions?.wechat"\n class="login-select-button"\n [class.active]="authServ.activeButton === \'微信扫码\'"\n (click)="setActiveButton(\'微信扫码\')"\n >\n 微信扫码\n </button>\n </div>\n </div>\n\n \x3c!--手机验证码--\x3e\n <form class="message-form" [class.active]="authServ.activeButton === \'短信验证\'" *ngIf="authServ?.loginOptions?.mobilecode">\n <div class="login-input-box">\n <div class="popup-input-frontnumber">+86</div>\n <input\n class="popup-input-itemone"\n type="text"\n required="required"\n [(ngModel)]="loginInfo.mobile"\n [ngModelOptions]="{ standalone: true }"\n maxlength="12"\n placeholder="请输入手机号"\n />\n </div>\n <div *ngIf="authServ?.enabledLocalCode"\n class="login-input-box local-code" #canvasDom>\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n [(ngModel)]="localCodeNum"\n [ngModelOptions]="{ standalone: true }"\n maxlength="4"\n placeholder="请输入校验码"\n />\n \x3c!-- <canvas\n #canvas\n width="100"\n height="44"\n (click)="updateDrawCode()"\n class="canvas"\n ></canvas> --\x3e\n </div>\n <div class="login-input-box">\n <input\n class="popup-input-itemtwo"\n type="text"\n required="required"\n placeholder="请输入短信验证码"\n [(ngModel)]="loginInfo.code"\n [ngModelOptions]="{ standalone: true }"\n maxlength="8"\n />\n <button\n class="checknumber-button"\n type="submit"\n [value]="buttonText"\n [disabled]="isCountingdown"\n (click)="startCountdown()"\n [class.active]="isCountingdown"\n >\n {{buttonText}}\n </button>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>未注册的手机号,将自动创建帐号并登录。</span>\n </div>\n\n <div class="login-submit-box">\n <button class="login-submit-button" type="submit" (click)="login()">\n 登录\n </button>\n </div>\n </form>\n\n \x3c!--账号密码登录--\x3e\n <form class="mobile-form" [class.active]="authServ.activeButton === \'账号密码\'" *ngIf="authServ?.loginOptions?.userpwd">\n <div class="login-input-box">\n <input\n maxlength="12"\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n \x3c!-- 记住密码 --\x3e\n <div class="passwprd-box">\n <div class="remember-password-box">\n <input type="checkbox" id="remember-password" />\n 记住密码\n </div>\n\n \x3c!-- 忘记密码 --\x3e\n <div class="password-forget" (click)="setActiveButton(\'注册帐号\')">\n 注册帐号\n </div>\n </div>\n\n \x3c!-- 用户协议 --\x3e\n <div class="rule-box">\n <span>\n <input type="checkbox" [(ngModel)]="isUserRuleChecked" [ngModelOptions]="{ standalone: true }" style="margin-right:5px"/>\n <span (click)="isUserRuleChecked=true">同意</span></span>\n <span (click)="isUserRuleChecked=true">《用户协议及隐私条款》</span>\n </div>\n\n\n \x3c!-- 忘记密码 --\x3e\n \x3c!-- <div class="password-forget">忘记密码?</div>\n </div> --\x3e\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="loginMobilePassword()"\n >\n 登录\n </button>\n </div>\n </form>\n\n \x3c!-- 帐号密码注册 --\x3e\n <form class="mobile-form" [class.active]="authServ.activeButton === \'注册帐号\'">\n <div class="login-input-box">\n <input\n [(ngModel)]="mobile"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="text"\n required="required"\n placeholder="请输入手机号"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请输入密码"\n />\n </div>\n\n <div class="login-input-box">\n <input\n [(ngModel)]="password2"\n [ngModelOptions]="{ standalone: true }"\n class="popup-input-itemnomal"\n type="password"\n required="required"\n placeholder="请再次输入密码"\n />\n </div>\n\n <div class="login-submit-box">\n <button\n class="login-submit-button"\n type="submit"\n (click)="signMobilePassword()"\n >\n 注册\n </button>\n </div>\n </form>\n\n \x3c!--微信扫码登陆--\x3e\n <form class="wechat-form" [class.active]="authServ.activeButton === \'微信扫码\'" *ngIf="authServ?.loginOptions?.wechat">\n <div class="wechat-login-box">\n <img\n class="login-erweima-img"\n [src]="authServ.wechatUrl"\n alt="微信扫码登陆二维码"\n />\n </div>\n <div class="wechat-explain">使用微信扫一扫,扫码登录 "飞码AI"</div>\n </form>\n\n \x3c!--返回首页--\x3e\n <div class="back-home-box" *ngIf="authServ.showBackHome">\n <button class="back-homepage-button" (click)="goHome()">\n 返回首页\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n',styles:['@charset "UTF-8";:host{--fmode-color-primary: #0199f9;--fmode-background-primary: #FFF}:host-context(body.dark) .popup{--fmode-color-primary: #7974ff;--fmode-background-primary: #000000}:host-context(body.dark) .popup .remember-password-box{color:#fff}.popup{display:flex;position:fixed;left:0;top:0;width:100%;height:100%;background-color:#0006;z-index:10000}@media screen and (max-width: 800px){.popup-content .popup-box{position:fixed!important;left:0!important;top:0!important;height:100vh!important;width:100vw!important;border-radius:0!important}.popup-content .popup-box .popup-box-content{border-radius:50px!important}}.popup-content{margin:7% auto;display:flex;width:500px;height:600px;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .popup-box{width:500px;height:600px;position:relative;border-radius:50px 5px;background-color:#1e90ff;overflow:hidden}.popup-content .popup-box .popup-box-content{position:absolute;border-radius:50px 5px;inset:4px;background-color:var(--fmode-background-primary);z-index:1}.popup-content .popup-box .popup-box-content .logo-img-login{margin-top:35px;position:relative;width:100%;display:flex;justify-content:center;z-index:2}.popup-content .popup-box .popup-box-content .logo-img-login img{height:auto;max-width:150px}.popup-content .popup-box .popup-box-content .close-icon-box{position:relative;top:20px;right:20px;float:right;font-size:20px;cursor:pointer;z-index:2}.popup-content .popup-box .popup-box-content .button-box{display:flex;justify-content:center;padding-top:32px;padding-right:59px;padding-left:59px;border-radius:10px;width:100%;height:72px}.popup-content .popup-box .popup-box-content .button-box .button-group{position:relative;display:flex;width:100%;line-height:40px;border-radius:10px;background-color:plum;z-index:2}.popup-content .popup-box .popup-box-content .button-box .login-select-button{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#fff;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button:hover{flex:1;outline:none;border:none;border-radius:10px;font-size:16px;cursor:pointer;color:#000;background-color:inherit;transition:background-color .3s}.popup-content .popup-box .popup-box-content .button-box .login-select-button.active{background-color:var(--fmode-color-primary);border-radius:10px}.popup-content .popup-box .popup-box-content input{color:#000}.popup-content .popup-box .popup-box-content .message-form,.popup-content .popup-box .popup-box-content .mobile-form,.popup-content .popup-box .popup-box-content .wechat-form{display:none}.popup-content .popup-box .popup-box-content .message-form.active,.popup-content .popup-box .popup-box-content .mobile-form.active,.popup-content .popup-box .popup-box-content .wechat-form.active{display:block}.popup-content .popup-box:before{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#f902ff,#f902ff);transform-origin:bottom right;animation:animate 6s linear infinite}.popup-content .popup-box:after{content:"";position:absolute;top:-50%;left:-50%;width:500px;height:600px;background:linear-gradient(0deg,transparent,#00dbde,#00dbde);transform-origin:bottom right;animation:animate 6s linear infinite;animation-delay:-3s}@keyframes animate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.popup-content .login-submit-box{position:relative}.popup-content .login-submit-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .login-submit-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .login-submit-button:hover{color:var(--fmode-color-primary)}.popup-content .login-submit-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .login-submit-button:active{transform:scale(.9)}.popup-content .message-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .message-form .login-input-box{display:flex;align-items:center;padding-top:10px}.popup-content .message-form .login-input-box .popup-input-frontnumber{padding:6px 12px;position:relative;border-radius:10px 0 0 10px;line-height:40px;font-size:18px;color:#4d4d4d;background-color:#ededed}.popup-content .message-form .popup-input-itemone{padding:6px 12px;position:relative;line-height:40px;border-radius:0 10px 10px 0;border:0;width:93%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .popup-input-itemtwo{padding:6px 12px 6px 16px;position:relative;line-height:40px;border-radius:10px;border:0;width:55%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .message-form .checknumber-button{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;color:#fff;background:var(--fmode-color-primary)}.popup-content .message-form .checknumber-button:hover{margin-left:46px;padding:6px;border-radius:10px;line-height:40px;font-size:18px;width:124px;border:none;outline:none;cursor:pointer;background:#4bace9}.popup-content .message-form .checknumber-button.active{background:#c7c7c7}.popup-content .mobile-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .mobile-form .login-input-box{padding-top:10px}.popup-content .mobile-form .login-input-box .popup-input-itemnomal{margin-top:20px;padding:6px 12px 6px 14px;position:relative;line-height:40px;border-radius:10px;border:0;width:100%;outline:none;box-shadow:none;font-size:18px;letter-spacing:.03em;background-color:#ededed;transition:.5s}.popup-content .mobile-form .rule-box{display:flex;padding-top:4px;padding-left:15px;padding-right:10px;justify-content:space-between;font-size:15px}.popup-content .mobile-form .rule-box span,.popup-content .mobile-form .rule-box ion-checkbox{font-size:15px;color:var(--fmode-color-primary)}.popup-content .mobile-form .passwprd-box{display:flex;padding-top:4px;justify-content:space-between}.popup-content .mobile-form .passwprd-box .remember-password-box{margin:10px 0 0 15px;font-size:15px}.popup-content .mobile-form .passwprd-box .password-forget{margin-top:10px;margin-right:15px;font-size:15px;color:gray;cursor:pointer}.popup-content .mobile-form .passwprd-box .password-forget:hover{margin-top:10px;margin-right:15px;font-size:15px;color:#000;cursor:pointer}.popup-content .wechat-form{padding:6px 55px;display:flex;position:relative;border-radius:50px 5px;background-color:var(--fmode-background-primary)}.popup-content .wechat-form .wechat-login-box{display:flex;justify-content:center}.popup-content .wechat-form .wechat-login-box .login-erweima-img{margin-top:30px;width:210px}.popup-content .wechat-form .wechat-explain{padding-top:20px;font-size:16px;text-align:center}.popup-content .back-home-box{display:flex;justify-content:center;padding:6px 55px}.popup-content .back-homepage-button{margin-top:15px;padding:6px;width:100%;line-height:40px;border-radius:10px;border:0;position:relative;box-shadow:0 2px 10px #00000029,0 3px 6px #0000001a;text-decoration:none;font-size:18px;font-weight:700;letter-spacing:2px;text-align:center;color:#fff;background-color:var(--fmode-color-primary);transition:.3s ease all;cursor:pointer;z-index:1}.popup-content .back-homepage-button:before{transition:.5s all ease;position:absolute;inset:0 50%;opacity:0;content:"";background-color:var(--fmode-background-primary);z-index:-1}.popup-content .back-homepage-button:hover{color:var(--fmode-color-primary)}.popup-content .back-homepage-button:hover:before{border-radius:10px;border:3px solid var(--fmode-color-primary);box-sizing:border-box;transition:.5s all ease;left:0;right:0;opacity:1}.popup-content .local-code{justify-content:space-between}.popup-content .local-code .canvas{border:1px solid #c2def5;border-radius:5px;width:100px;height:44px}\n']}]}],ctorParameters:()=>[{type:i1.NzMessageService},{type:i2.AuthService},{type:i3.Router},{type:i4.HttpClient},{type:i5.ToastController}],propDecorators:{canvasDom:[{type:ViewChild,args:["canvasDom"]}],handleEscapeKey:[{type:HostListener,args:["document:keydown.escape",["$event"]]}]}});
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL21vZGFsLXVzZXItbG9naW4vbW9kYWwtdXNlci1sb2dpbi5jb21wb25lbnQubWpz`
|
|
10
10
|
|