fmode-ng 0.0.219 → 0.0.221
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/story/fm-story-loader/fm-story-loader.component.mjs +1 -1
- package/esm2022/lib/core/index.mjs +1 -1
- package/esm2022/lib/core/parse/fmode.user.mjs +1 -1
- package/esm2022/lib/core/social/wxwork/login-modal.mjs +10 -0
- package/esm2022/lib/core/social/wxwork/wxwork.auth.mjs +1 -1
- package/esm2022/lib/core/social/wxwork/wxwork.sdk.mjs +1 -1
- package/esm2022/lib/core/storage/gen-file-key.mjs +10 -0
- package/esm2022/lib/core/storage/hwobs.provider.mjs +10 -0
- package/esm2022/lib/core/storage/index.mjs +10 -0
- package/esm2022/lib/core/storage/nova-storage.mjs +10 -0
- package/esm2022/lib/core/storage/qiniu.provider.mjs +10 -0
- package/esm2022/lib/core/storage/types.mjs +10 -0
- package/esm2022/lib/{storage/service-upload → core/storage}/util-file-md5.mjs +3 -3
- package/esm2022/lib/core/storage/util-file-metadata.mjs +10 -0
- package/esm2022/lib/social/wxwork/wxwork-auth.guard.mjs +1 -1
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +1 -1
- package/fesm2022/fmode-ng.mjs +1 -1
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/core/index.d.ts +3 -0
- package/lib/core/social/wxwork/login-modal.d.ts +2 -0
- package/lib/core/social/wxwork/wxwork.auth.d.ts +4 -0
- package/lib/core/social/wxwork/wxwork.sdk.d.ts +6 -2
- package/lib/core/storage/gen-file-key.d.ts +4 -0
- package/lib/core/storage/hwobs.provider.d.ts +9 -0
- package/lib/core/storage/index.d.ts +6 -0
- package/lib/core/storage/nova-storage.d.ts +43 -0
- package/lib/core/storage/qiniu.provider.d.ts +7 -0
- package/lib/core/storage/types.d.ts +58 -0
- package/lib/core/storage/util-file-md5.d.ts +4 -0
- package/lib/{storage/service-upload → core/storage}/util-file-metadata.d.ts +1 -2
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -12
- package/package.json +1 -1
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +0 -10
- package/lib/storage/service-upload/util-file-md5.d.ts +0 -1
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{CommonModule}from"@angular/common";import{ChangeDetectorRef,Component,Input}from"@angular/core";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import{NavController}from"@ionic/angular";import{ChatService}from"../../service-fmai/service-chat/chat.service";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{NovaUploadService}from"../../../storage/service-upload/nova-upload.service";import{FmodeChat}from"../../../core";import{FmChatMesssageArea}from"../../chat";import{NzIconModule}from"ng-zorro-antd/icon";import{NzUploadModule}from"ng-zorro-antd/upload";import{FmodeParse}from"../../../core/parse";import{from}from"rxjs";import{StoryService}from"../story.service";import{AgentStory}from"../../../core";import{FmOfficeViewerComponent}from"../fm-office-viewer/fm-office-viewer.component";import{FmStorySplitterComponent}from"../fm-story-splitter/fm-story-splitter.component";import{CompDiaryStoryComponent}from"../modal-chat-story/comp-diary-story/comp-diary-story.component";import{getRoleById}from"../fm-story-list/story-preview";import{CompChatStoryJsonComponent}from"../modal-chat-story/comp-chat-story-json/comp-chat-story-json.component";import*as i0 from"@angular/core";import*as i1 from"../../../storage/service-upload/nova-upload.service";import*as i2 from"../../service-fmai/service-chat/chat.service";import*as i3 from"@ionic/angular";import*as i4 from"../../../nova-cloud/nova-cloud.service";import*as i5 from"../story.service";import*as i6 from"@angular/common";import*as i7 from"ng-zorro-antd/upload";import*as i8 from"ng-zorro-antd/icon";const Parse=FmodeParse.with("nova");export class FmStoryLoaderComponent{constructor(o,t,e,n,i,r){this.nupload=o,this.chatServ=t,this.navCtrl=e,this.ncloud=n,this.cdRef=i,this.storyServ=r,this.isSelectMode=!1,this.fileType="",this.uploadToNovaRequest=o=>{console.log("fileReq",o),console.log(o?.file);let t=o.postFile;return from(this.nupload.upload(t,(t=>{o.file.percent=t?.total?.percent||0,100==t?.total?.percent&&(o.file.status="done",this.uploadedFile=o.file),console.log("progress",t)}))).subscribe({next:async t=>{console.log("response",t),t?.id&&(this.attachment=await(this.story?.setAttachment(t)),this.story?.story?.set("attach",this.attachment),this.cdRef.detectChanges(),console.log(this.story)),o.onSuccess?.(t,o.file,null)},error:t=>{o.onError?.(t,o.file)}})},this.fileType=["text/csv","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/pdf","application/vnd.openxmlformats-officedocument.presentationml.presentation"].join(",")}ngOnInit(){this.initStory()}initStory(o,t){this.attachment=void 0,this.chatSession=void 0,this.fmodeChat=void 0,o&&(this.story=o),setTimeout((()=>{t?.isNew&&(this.story=this.storyServ.storyList?.[0]),this.attachment=this.story?.story?.get("attach"),this.chatSession=this.story?.story?.get("chatSession"),this.loadChatSessionToFmodeChat(this.story)}),100)}async loadChatSessionToFmodeChat(o){let t=o?.story?.get("chatSession"),e=t?.id||t?.objectId;if(console.log("chatId",e),!t?.get("role")?.id){let o=new Parse.Query("ChatSession");o.equalTo("objectId",e),o.include("role"),t=await o.first(e)}if(e){let o=await getRoleById(t?.get("role")?.id),n=this.navCtrl;this.fmodeChat=new FmodeChat(e,o,t,this,n,this.ncloud,this.nupload),this.chatServ.chatMap[e]=this.fmodeChat}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,deps:[{token:i1.NovaUploadService},{token:i2.ChatService},{token:i3.NavController},{token:i4.NovaCloudService},{token:i0.ChangeDetectorRef},{token:i5.StoryService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryLoaderComponent,isStandalone:!0,selector:"fm-story-loader",inputs:{isSelectMode:"isSelectMode",story:"story"},providers:[NovaUploadService,Diagnostic],ngImport:i0,template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:NzUploadModule},{kind:"component",type:i7.NzUploadComponent,selector:"nz-upload",inputs:["nzType","nzLimit","nzSize","nzFileType","nzAccept","nzAction","nzDirectory","nzOpenFileDialogOnClick","nzBeforeUpload","nzCustomRequest","nzData","nzFilter","nzFileList","nzDisabled","nzHeaders","nzListType","nzMultiple","nzName","nzShowUploadList","nzShowButton","nzWithCredentials","nzRemove","nzPreview","nzPreviewFile","nzPreviewIsImage","nzTransformFile","nzDownload","nzIconRender","nzFileListRender"],outputs:["nzChange","nzFileListChange"],exportAs:["nzUpload"]},{kind:"ngmodule",type:NzIconModule},{kind:"directive",type:i8.NzIconDirective,selector:"[nz-icon]",inputs:["nzSpin","nzRotate","nzType","nzTheme","nzTwotoneColor","nzIconfont"],exportAs:["nzIcon"]},{kind:"component",type:FmOfficeViewerComponent,selector:"fm-office-viewer",inputs:["officeHost","wopiHost","fileId","permission","showHeader"]},{kind:"component",type:FmStorySplitterComponent,selector:"fm-story-splitter",inputs:["story"]},{kind:"component",type:CompDiaryStoryComponent,selector:"comp-diary-story",inputs:["story","person","showHeader","readOnly"]},{kind:"component",type:CompChatStoryJsonComponent,selector:"comp-chat-story-json",inputs:["story","person","showHeader"]},{kind:"component",type:FmChatMesssageArea,selector:"fm-chat-message-area",inputs:["chatId","chat"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,decorators:[{type:Component,args:[{selector:"fm-story-loader",standalone:!0,imports:[CommonModule,NzUploadModule,NzIconModule,FmOfficeViewerComponent,FmStorySplitterComponent,CompDiaryStoryComponent,CompChatStoryJsonComponent,FmChatMesssageArea],providers:[NovaUploadService,Diagnostic],template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"]}]}],ctorParameters:()=>[{type:i1.NovaUploadService},{type:i2.ChatService},{type:i3.NavController},{type:i4.NovaCloudService},{type:i0.ChangeDetectorRef},{type:i5.StoryService}],propDecorators:{isSelectMode:[{type:Input}],story:[{type:Input}]}});
|
|
8
|
+
import{CommonModule}from"@angular/common";import{ChangeDetectorRef,Component,Input}from"@angular/core";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import{NavController}from"@ionic/angular";import{ChatService}from"../../service-fmai/service-chat/chat.service";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{NovaUploadService}from"../../../storage/service-upload/nova-upload.service";import{FmodeChat}from"../../../core";import{FmChatMesssageArea}from"../../chat";import{NzIconModule}from"ng-zorro-antd/icon";import{NzUploadModule}from"ng-zorro-antd/upload";import{FmodeParse}from"../../../core/parse";import{from}from"rxjs";import{StoryService}from"../story.service";import{AgentStory}from"../../../core";import{FmOfficeViewerComponent}from"../fm-office-viewer/fm-office-viewer.component";import{FmStorySplitterComponent}from"../fm-story-splitter/fm-story-splitter.component";import{CompDiaryStoryComponent}from"../modal-chat-story/comp-diary-story/comp-diary-story.component";import{getRoleById}from"../fm-story-list/story-preview";import{CompChatStoryJsonComponent}from"../modal-chat-story/comp-chat-story-json/comp-chat-story-json.component";import*as i0 from"@angular/core";import*as i1 from"../../../storage/service-upload/nova-upload.service";import*as i2 from"../../service-fmai/service-chat/chat.service";import*as i3 from"@ionic/angular";import*as i4 from"../../../nova-cloud/nova-cloud.service";import*as i5 from"../story.service";import*as i6 from"@angular/common";import*as i7 from"ng-zorro-antd/upload";import*as i8 from"ng-zorro-antd/icon";const Parse=FmodeParse.with("nova");export class FmStoryLoaderComponent{constructor(o,t,e,n,i,r){this.nupload=o,this.chatServ=t,this.navCtrl=e,this.ncloud=n,this.cdRef=i,this.storyServ=r,this.isSelectMode=!1,this.fileType="",this.uploadToNovaRequest=o=>{console.log("fileReq",o),console.log(o?.file);let t=o.postFile;return from(this.nupload.upload(t,(t=>{o.file.percent=t?.total?.percent||0,100==t?.total?.percent&&(o.file.status="done",this.uploadedFile=o.file),console.log("progress",t)}))).subscribe({next:async t=>{console.log("response",t),t?.id&&(this.attachment=await(this.story?.setAttachment({id:t.id})),this.story?.story?.set("attach",this.attachment),this.cdRef.detectChanges(),console.log(this.story)),o.onSuccess?.(t,o.file,null)},error:t=>{o.onError?.(t,o.file)}})},this.fileType=["text/csv","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/pdf","application/vnd.openxmlformats-officedocument.presentationml.presentation"].join(",")}ngOnInit(){this.initStory()}initStory(o,t){this.attachment=void 0,this.chatSession=void 0,this.fmodeChat=void 0,o&&(this.story=o),setTimeout((()=>{t?.isNew&&(this.story=this.storyServ.storyList?.[0]),this.attachment=this.story?.story?.get("attach"),this.chatSession=this.story?.story?.get("chatSession"),this.loadChatSessionToFmodeChat(this.story)}),100)}async loadChatSessionToFmodeChat(o){let t=o?.story?.get("chatSession"),e=t?.id||t?.objectId;if(console.log("chatId",e),!t?.get("role")?.id){let o=new Parse.Query("ChatSession");o.equalTo("objectId",e),o.include("role"),t=await o.first(e)}if(e){let o=await getRoleById(t?.get("role")?.id),n=this.navCtrl;this.fmodeChat=new FmodeChat(e,o,t,this,n,this.ncloud,this.nupload),this.chatServ.chatMap[e]=this.fmodeChat}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,deps:[{token:i1.NovaUploadService},{token:i2.ChatService},{token:i3.NavController},{token:i4.NovaCloudService},{token:i0.ChangeDetectorRef},{token:i5.StoryService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryLoaderComponent,isStandalone:!0,selector:"fm-story-loader",inputs:{isSelectMode:"isSelectMode",story:"story"},providers:[NovaUploadService,Diagnostic],ngImport:i0,template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:NzUploadModule},{kind:"component",type:i7.NzUploadComponent,selector:"nz-upload",inputs:["nzType","nzLimit","nzSize","nzFileType","nzAccept","nzAction","nzDirectory","nzOpenFileDialogOnClick","nzBeforeUpload","nzCustomRequest","nzData","nzFilter","nzFileList","nzDisabled","nzHeaders","nzListType","nzMultiple","nzName","nzShowUploadList","nzShowButton","nzWithCredentials","nzRemove","nzPreview","nzPreviewFile","nzPreviewIsImage","nzTransformFile","nzDownload","nzIconRender","nzFileListRender"],outputs:["nzChange","nzFileListChange"],exportAs:["nzUpload"]},{kind:"ngmodule",type:NzIconModule},{kind:"directive",type:i8.NzIconDirective,selector:"[nz-icon]",inputs:["nzSpin","nzRotate","nzType","nzTheme","nzTwotoneColor","nzIconfont"],exportAs:["nzIcon"]},{kind:"component",type:FmOfficeViewerComponent,selector:"fm-office-viewer",inputs:["officeHost","wopiHost","fileId","permission","showHeader"]},{kind:"component",type:FmStorySplitterComponent,selector:"fm-story-splitter",inputs:["story"]},{kind:"component",type:CompDiaryStoryComponent,selector:"comp-diary-story",inputs:["story","person","showHeader","readOnly"]},{kind:"component",type:CompChatStoryJsonComponent,selector:"comp-chat-story-json",inputs:["story","person","showHeader"]},{kind:"component",type:FmChatMesssageArea,selector:"fm-chat-message-area",inputs:["chatId","chat"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,decorators:[{type:Component,args:[{selector:"fm-story-loader",standalone:!0,imports:[CommonModule,NzUploadModule,NzIconModule,FmOfficeViewerComponent,FmStorySplitterComponent,CompDiaryStoryComponent,CompChatStoryJsonComponent,FmChatMesssageArea],providers:[NovaUploadService,Diagnostic],template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"]}]}],ctorParameters:()=>[{type:i1.NovaUploadService},{type:i2.ChatService},{type:i3.NavController},{type:i4.NovaCloudService},{type:i0.ChangeDetectorRef},{type:i5.StoryService}],propDecorators:{isSelectMode:[{type:Input}],story:[{type:Input}]}});
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWxvYWRlci9mbS1zdG9yeS1sb2FkZXIuY29tcG9uZW50Lm1qcw==`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/index.mjs
|
|
7
7
|
*/
|
|
8
|
-
export*from"./agent";export*from"./voice";export*from"./parse";export*from"./social";
|
|
8
|
+
export*from"./agent";export*from"./voice";export*from"./parse";export*from"./social";export*from"./storage";export*from"./storage/util-file-md5";export*from"./storage/util-file-metadata";
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL2luZGV4Lm1qcw==`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/fmode.user.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{FmodeObject}from"./fmode.object";export class FmodeUser extends FmodeObject{static{this._instance=null}static{this.instanceKey=()=>{if(!this._instance)throw new Error("FmodeParse not initialized before using User");return"Parse/"+this._instance.appId+"/currentUser"}}static bindInstance(e){this._instance=e}static get instance(){if(!this._instance)throw new Error("FmodeParse not initialized");return this._instance}get username(){return this.get("username")}set username(e){this.set("username",e)}get email(){return this.get("email")}set email(e){this.set("email",e)}get password(){return this.get("password")}set password(e){this.set("password",e)}constructor(e){super("_User"),e&&(this.id=e?.objectId,this.createdAt=new Date(e?.createdAt),this.updatedAt=new Date(e?.updatedAt),e.sessionToken&&(this.sessionToken=e.sessionToken,delete e.sessionToken),this.set(e))}static async logIn(e,s){const t=`${this.instance.serverURL}/login`,
|
|
8
|
+
import{FmodeObject}from"./fmode.object";export class FmodeUser extends FmodeObject{static{this._instance=null}static{this.instanceKey=()=>{if(!this._instance)throw new Error("FmodeParse not initialized before using User");return"Parse/"+this._instance.appId+"/currentUser"}}static bindInstance(e){this._instance=e}static get instance(){if(!this._instance)throw new Error("FmodeParse not initialized");return this._instance}get username(){return this.get("username")}set username(e){this.set("username",e)}get email(){return this.get("email")}set email(e){this.set("email",e)}get password(){return this.get("password")}set password(e){this.set("password",e)}constructor(e){super("_User"),e&&(this.id=e?.objectId,this.createdAt=new Date(e?.createdAt),this.updatedAt=new Date(e?.updatedAt),e.sessionToken&&(this.sessionToken=e.sessionToken,delete e.sessionToken),this.set(e))}static async logIn(e,s){const t=`${this.instance.serverURL}/login`,n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-Parse-Application-Id":this.instance.appId},body:JSON.stringify({username:e,password:s})}),r=await n.json();if(r.error)throw r;const i=new this({...r,username:e,password:s});return i._saveToCache(),i}static async become(e){const s=`${this.instance.serverURL}/users/me`;let t={"X-Parse-Session-Token":e,"X-Parse-Application-Id":this.instance.appId};const n=await fetch(s,{headers:t}),r=await n.json();if(r.error)throw r.error;const i=new this({...r,sessionToken:e});return i._saveToCache(),i}static async signUp(e,s,t={}){return new this({...t,username:e,password:s}).signUp()}static async logOut(){if(this.current())try{await fetch(`${this.instance.serverURL}/logout`,{method:"POST",headers:{"X-Parse-Session-Token":this.current().sessionToken,"X-Parse-Application-Id":this.instance.appId}})}finally{this._clearCurrentUser()}}static async requestPasswordReset(e){const s=`${this.instance.serverURL}/requestPasswordReset`,t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","X-Parse-Application-Id":this.instance.appId},body:JSON.stringify({email:e})}),n=await t.json();if(n.error)throw n}static{this._currentUser=null}static current(){if(this._currentUser)return this._currentUser;try{const e=localStorage.getItem(this.instanceKey());if(!e)return null;const s=JSON.parse(e);if(!s.sessionToken)return null;const t=new this(s);return this._currentUser=t,t.sessionToken&&this._instance&&(this._instance.sessionToken=t.sessionToken),t}catch(e){return console.warn("Failed to restore user from cache",e),null}}static _clearCurrentUser(){this._currentUser=null,this._instance&&(this._instance.sessionToken=void 0),localStorage.removeItem(this.instanceKey())}async signUp(e){if(e&&this.set(e),!this.username)throw new Error("Username is required");if(!this.password)throw new Error("Password is required");let s=this.toJSON();delete s.__type,delete s.className;const t=`${FmodeUser.instance.serverURL}/users`,n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-Parse-Application-Id":FmodeUser.instance.appId},body:JSON.stringify(s)}),r=await n.json();if(r.error)throw r;return this.id=r.objectId,this.createdAt=new Date(r.createdAt),this.sessionToken=r.sessionToken,this._saveToCache(),this}async save(){const e=`${FmodeUser.instance.serverURL}/users/${this.id||this.data.objectId}`,s={"Content-Type":"application/json","X-Parse-Application-Id":FmodeUser.instance.appId,"X-Parse-Session-Token":this.sessionToken},t=this.toJSON();delete t.__type,delete t.objectId,delete t.className,delete t.sessionToken,delete t.username,delete t.createdAt,delete t.updatedAt;const n=await fetch(e,{method:"PUT",headers:s,body:JSON.stringify(t)}),r=await n.json();if(r.error)throw 209===r.code&&FmodeUser._clearCurrentUser(),new Error(r.error);return this.set("updatedAt",new Date(r.updatedAt)),this._saveToCache(),this}_saveToCache(){this.sessionToken&&(FmodeUser._currentUser=this,FmodeUser._instance&&(FmodeUser._instance.sessionToken=this.sessionToken),localStorage.setItem(FmodeUser.instanceKey(),JSON.stringify(this.toJSONForCache())))}toJSONForCache(){return{...super.toJSON(),sessionToken:this.sessionToken}}getSessionToken(){return this.sessionToken}async destroy(e){if(!this.id)throw new Error("Cannot destroy unsaved user");const s=`${FmodeUser.instance.serverURL}/users/${this.id}`,t={"X-Parse-Session-Token":this.sessionToken,"X-Parse-Application-Id":FmodeUser.instance.appId};e?.useMasterKey&&FmodeUser.instance.config.masterKey&&(t["X-Parse-Master-Key"]=FmodeUser.instance.config.masterKey);const n=await fetch(s,{method:"DELETE",headers:t});if(!n.ok){const e=await n.json();throw new Error(e.error||"Failed to delete user")}FmodeUser._clearCurrentUser()}}
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2Ztb2RlLnVzZXIubWpz`
|
|
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/core/social/wxwork/login-modal.mjs
|
|
7
|
+
*/
|
|
8
|
+
export const createLoginContainer=()=>{const n=document.getElementById("ww_login");n&&n.remove();const e=document.createElement("div");e.id="ww_login",e.style.cssText="\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.9);\n z-index: 99999; /* 确保在最顶层 */\n ",document.body.appendChild(e)};export const removeLoginContainer=()=>{try{const n=document.getElementById("ww_login");n&&n.remove()}catch(n){}};
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3NvY2lhbC93eHdvcmsvbG9naW4tbW9kYWwubWpz`
|
|
10
|
+
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/social/wxwork/wxwork.auth.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{WxworkSDK}from"./wxwork.sdk";import{FmodeParse}from"../../parse";const Parse=FmodeParse.with("nova");export class WxworkAuth{constructor(r){this.cid=r.cid,this.wxwork=new WxworkSDK({cid:r.cid,appId:r.appId||"crm"})}async getUserInfo(r){try{return await this.wxwork.getUserinfo(r)}catch(r){throw console.error("WxworkAuth.getUserInfo error:",r),r}}async syncUserInfo(r){try{if(r||(r=await this.getUserInfo()),!r)throw new Error("无法获取用户信息");return await this.wxwork.syncUserInfo(r)}catch(r){throw console.error("WxworkAuth.syncUserInfo error:",r),r}}async autoLogin(r){try{const o=Parse.User.current();if(o?.id){console.log("用户已登录:",o.get("username"))
|
|
8
|
+
import{WxworkSDK}from"./wxwork.sdk";import{FmodeParse}from"../../parse";const Parse=FmodeParse.with("nova");export async function checkWeworkLogin(r){console.log("WxworkAuthGuard");let o=r.paramMap.get("cid")||r.queryParamMap.get("cid")||localStorage.getItem("cid");o&&localStorage.setItem("company",o);let t,e=r.paramMap.get("appId")||"crm",a=new WxworkAuth({cid:o,appId:e});console.log("init wxwork");try{if(t=await a.getUserInfo(),console.log("guard userInfo"+JSON.stringify(t)),t)return await a.syncUserInfo(t),await a.autoLogin(t),!0}catch(r){console.error(r),console.log("guierr"+JSON.stringify(r))}let s=new URL(location?.href).searchParams.get("code");if(console.log("WxworkAuthGuard"+o+s),!s){let r=navigator.userAgent.toLowerCase();if(console.log("ua",r),-1!==r.indexOf("micromessenger")){let r="snsapi_base";"wechat"==a.platform()&&(r="snsapi_base"),"wxwork"==a.platform()&&(r="snsapi_privateinfo");let o=await a.oauth(r);return o&&(s=o),!1}s||(s=await a.loginPC())}try{t=await a.getUserInfo(s)}catch(r){console.log("codeinfoerr:"+JSON.stringify(r))}return console.log("before sync"+t?.mobile),await a.syncUserInfo(t),await a.autoLogin(t),!0}export class WxworkAuth{constructor(r){this.cid=r.cid||localStorage.getItem("company"),this.wxwork=new WxworkSDK({cid:r.cid,appId:r.appId||"crm"}),this.platform=this.wxwork.platform}async currentProfile(){let r=await this.getUserInfo(),o=await this.wxwork.getContactOrProfile(r);return"Profile"==o?.className?o:null}async currentContact(){let r=await this.getUserInfo(),o=await this.wxwork.getContactOrProfile(r);return"ContactInfo"==o?.className?o:null}async getUserInfo(r){try{return await this.wxwork.getUserinfo(r)}catch(r){throw console.error("WxworkAuth.getUserInfo error:",r),r}}async syncUserInfo(r){try{if(r||(r=await this.getUserInfo()),!r)throw new Error("无法获取用户信息");return await this.wxwork.syncUserInfo(r)}catch(r){throw console.error("WxworkAuth.syncUserInfo error:",r),r}}async autoLogin(r){try{r||(r=await this.getUserInfo());const o=Parse.User.current();if(o?.id){console.log("用户已登录:",o.get("username"));const t=await this.wxwork.getContactOrProfile(r);return t?.id&&!t.get("user")?.id&&(t.set("user",o.toPointer()),await t.save(),console.log("已同步 user 指针到 Profile/UserSocial")),o}if(r||(r=await this.getUserInfo()),!r)throw new Error("无法获取用户信息");const t=r.userid||r.external_userid||r.openid;if(!t||t.length<6)return console.warn("用户名太短,无法自动登录:",t),null;const e=t.slice(-6);try{let o;o=await Parse.User.logIn(t,e);const a=await this.wxwork.getContactOrProfile(r);return a?.id&&!a.get("user")?.id&&(a.set("user",o.toPointer()),await a.save(),console.log("已同步 user 指针到 Profile/UserSocial")),o}catch(o){if(console.log("loginError",o),!("string"==typeof o&&o.indexOf("Invalid")>-1||101===o?.code))throw console.error("自动登录失败:",o),o;{console.log("用户不存在,创建新用户:",t);const o=new Parse.User;o.set("username",t),o.set("password",e),r.mobile&&o.set("mobile",r.mobile),r.email&&o.set("email",r.email);try{const e=await o.signUp();console.log("自动注册成功:",t);const a=await this.wxwork.getContactOrProfile(r);return a?.id&&(a.set("user",e.toPointer()),await a.save(),console.log("已同步 user 指针到 Profile/UserSocial")),e}catch(r){throw console.error("自动注册失败:",r),r}}}}catch(r){throw console.error("WxworkAuth.autoLogin error:",r),r}}async authenticateAndLogin(r){try{const o=await this.getUserInfo(r),t=await this.autoLogin(o);return{userInfo:o,profile:await this.syncUserInfo(o),user:t}}catch(r){throw console.error("WxworkAuth.authenticateAndLogin error:",r),r}}async oauth(r="snsapi_base",o=!1){try{return await this.wxwork.oauth(r,o)}catch(r){throw console.error("WxworkAuth.oauth error:",r),r}}async loginPC(){try{return await this.wxwork.loginPC()}catch(r){throw console.error("WxworkAuth.loginPC error:",r),r}}getSDK(){return this.wxwork}}
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3NvY2lhbC93eHdvcmsvd3h3b3JrLmF1dGgubWpz`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/social/wxwork/wxwork.sdk.mjs
|
|
7
7
|
*/
|
|
8
|
-
import*as ww from"@wecom/jssdk";import{FmodeParse}from"../../parse";const Parse=FmodeParse.with("nova");import{WxworkCorp}from"./wxwork.corp";import{wxdebug}from"../wxdebug";export class WxworkSDK{constructor(e){this.companyMap={E4KpGvTEto:{corpResId:"vsVIWbd1i9"},uRiDGwEYLi:{corpResId:"JxfFXBr0ly"},cDL6R1hgSi:{corpResId:"SpL6gyD1Gu"}},this.suiteMap={crm:{suiteId:"dk2559ba758f33d8f5"}},this.ww=ww,this.groupChat={createGroupChat:async e=>{try{return wxdebug("createGroupChat"+JSON.stringify(e)),await this.registerCorpWithSuite()?new Promise(((t,r)=>{e.success=e=>{wxdebug(JSON.stringify(e)),t(e)},e.fail=e=>{wxdebug(JSON.stringify(e)),r(e)},ww.createCorpGroupChat(e)})):null}catch(e){wxdebug(JSON.stringify(e))}},addUserInfoGroup:async e=>{wxdebug("addUserInfoGroup"+JSON.stringify(e));try{let t=await this.registerCorpWithSuite();return wxdebug("isRegister"+t),t?(wxdebug(JSON.stringify(e)),new Promise(((t,r)=>{e.success=e=>{wxdebug(JSON.stringify(e)),t(e)},e.fail=e=>{wxdebug(JSON.stringify(e)),r(e)},ww.updateCorpGroupChat(e)}))):null}catch(e){wxdebug(JSON.stringify(e))}}},this.cid=e?.cid,this.appId=e?.appId,this.wecorp=new WxworkCorp(this.cid)}async syncGroupChat(e){let t=new Parse.Query("GroupChat");t.equalTo("chat_id",e?.chat_id);let r=await t.first();if(r?.id||(r=new Parse.Object("GroupChat")),!r?.get("joinUrl")){let t=(await this.wecorp.externalContact.groupChat.addJoinWay({scene:1,chat_id_list:[e.chat_id]}))?.config_id,o=(await this.wecorp.externalContact.groupChat.getJoinWay(t))?.join_way;r.set("joinUrl",o)}if(!r?.get("joinQrcode")){let t=(await this.wecorp.externalContact.groupChat.addJoinWay({scene:2,chat_id_list:[e.chat_id]}))?.config_id,o=(await this.wecorp.externalContact.groupChat.getJoinWay(t))?.join_way;r.set("joinQrcode",o)}let o={chat_id:e.chat_id,name:e.name,owner:e.owner,notice:e.notice},i=!1;return r.get("chat_id")!=e.chat_id&&(i=!0),r.get("name")!=e.name&&(i=!0),r.get("owner")!=e.owner&&(i=!0),r.get("notice")!=e.notice&&(i=!0),r.get("member_version")!=e.member_version&&(i=!0,o.member_list=e.member_list,o.member_version=e.member_version),r.set(o),this.cid&&r.set("company",{__type:"Pointer",className:"Company",objectId:this.cid}),i&&(r=await r.save()),r}async syncContact(e){const t=e.external_contact||e,r=t.external_userid;let o=new Parse.Query("ContactInfo");o.equalTo("external_userid",r);const i=new Parse.Object("Company");i.id=this.cid,o.equalTo("company",i);let a=await o.first();a?.id||(a=new Parse.Object("ContactInfo"),i?.id&&a.set("company",i.toPointer()));const n=t.name||"",s=t.mobile||"",c={...t,follow_user:e.follow_user||t.follow_user||[]};let l=!1;a.get("external_userid")!=r&&(l=!0),a.get("name")!=n&&n&&(l=!0),a.get("mobile")!=s&&s&&(l=!0);const d=a.get("data");return JSON.stringify(d)!==JSON.stringify(c)&&(l=!0),a.set("external_userid",r),a.set("name",n),a.set("mobile",s),a.set("data",c),wxdebug("syncContact",a.toJSON()),l&&(a=await a.save()),a}async getCurrentChatObject(){const e=await this.getCurrentChat();if(!e)return{currentChat:null};let t,r;try{if("chatId"===e.type&&e.group)t=await this.syncGroupChat(e.group);else if("userId"===e.type&&e.id){const t=await this.wecorp.externalContact.get(e.id);r=await this.syncContact(t)}}catch(e){console.error("getCurrentChatObject error:",e)}return{GroupChat:t,Contact:r,currentChat:e}}async syncUserInfo(e){let t=null;1==e.gender&&(t="男"),2==e.gender&&(t="女");let r=await this.getContactOrProfile(e);console.log("thisUser",r),console.log("userInfo",e),"UserSocial"==r.className&&r.set({data:{openid:e.openid,userid:e.userid,external_userid:e.external_userid,type:e.type&&String(e.type)||null,name:e.name,avatar:e.avatar,gender:t,qr_code:e.qr_code,mobile:e.mobile,email:e.email,biz_mail:e.biz_mail,address:e.address,position:e.position,corp_name:e.corp_name},type:"wecom-agency",company:{__type:"Pointer",className:"Company",objectId:this.cid}}),"Profile"==r.className&&(r.set({openid:e.openid,userid:e.userid,external_userid:e.external_userid,type:e.type&&String(e.type)||null,name:e.name,avatar:e.avatar,gender:t,qr_code:e.qr_code,mobile:e.mobile,email:e.email,biz_mail:e.biz_mail,address:e.address,position:e.position,corp_name:e.corp_name,company:{__type:"Pointer",className:"Company",objectId:this.cid}}),r.set("data",e));try{r=await r.save()}catch(e){wxdebug(e)}return r}async getUserinfo(e){let t,r;wxdebug("getUserinfo");let o=localStorage.getItem(`${this.cid}/USERINFO`);if(!e){t=JSON.parse(o),t.cid=this.cid,wxdebug("getContactOrProfile");try{r=await this.getContactOrProfile(t)}catch(e){}if(wxdebug("getUserinfo:"+o),t&&r)return t}if(!(e=new URL(location.href).searchParams.get("code")||e))return null;let i=await this.wecorp.auth.getuserinfo(e);if(wxdebug("result"+JSON.stringify(i)),i?.errcode)return console.error(i?.errmsg),null;let a=i?.external_userid;if(a){let e=await this.wecorp.externalContact.get(a);e?.external_contact&&Object.keys(e?.external_contact).forEach((t=>{i[t]=e?.external_contact[t]}))}return i.cid=this.cid,t=i,r=await this.getContactOrProfile(t),r?.get("mobile")&&(t.mobile=r?.get("mobile")),o=JSON.stringify(i),localStorage.setItem(`${this.cid}/USERINFO`,o),t}async getCurrentUser(){const e=await this.getUserinfo();if(!e)return null;return await this.getContactOrProfile(e)}async getContactOrProfile(e){let t;(e.openid||e.external_userid)&&(t="UserSocial"),e.userid&&(t="Profile");let r=[];"Profile"==t&&(e.openid&&r.push({openid:{$regex:e.openid}}),e.userid&&r.push({userid:{$regex:e.userid}}),e.mobile&&r.push({mobile:{$regex:e.mobile}}),e.email&&r.push({email:{$regex:e.email}}),e.external_userid&&r.push({external_userid:{$regex:e.external_userid}})),"UserSocial"==t&&(e.openid&&r.push({"data.openid":{$regex:e.openid}}),e.userid&&r.push({"data.userid":{$regex:e.userid}}),e.mobile&&r.push({"data.mobile":{$regex:e.mobile}}),e.email&&r.push({"data.email":{$regex:e.email}}),e.external_userid&&r.push({"data.external_userid":{$regex:e.external_userid}}));let o,i=Parse.Query.fromJSON(t,{where:{$or:r}});i.equalTo("company",this.cid),i.equalTo("userid",e.userid);try{o=await i.first()}catch(e){console.error(e)}o?.id||(o=new Parse.Object(t));let a=Parse.User.current();return a?.id&&(o?.get("user")?.id||o.set("user",a.toPointer())),o}async loginPC(){let e=await this.getCorpByCid(this.cid);console.log(this.cid,e);let t=e?.corpId,r=e?.agentId,o=new URL("https://app.fmode.cn"+location.pathname+location?.search);o.searchParams.delete("code"),o.searchParams.delete("state");let i=encodeURIComponent(o.href),a=ww.WWLoginType.corpApp,n=ww.WWLoginRedirectType.callback;return console.log("loginPC1"),new Promise((e=>{console.log("loginPC2");const o=this.ww.createWWLoginPanel({el:"#ww_login",params:{login_type:a,appid:t,agentid:r,redirect_uri:i,state:"loginState",redirect_type:n},onCheckWeComLogin({isWeComLogin:t}){console.log(t),e("")},onLoginSuccess({code:t}){console.log({code:t}),e(t)},onLoginFail(t){console.error("lpc",t),e("")}});console.log(o,o.el)}))}async oauth(e="snsapi_base",t=!1){t&&localStorage.removeItem(`${this.cid}/USERINFO`),wxdebug("oauth");let r=await this.getCorpByCid(this.cid);console.log(this.cid,r);let o=r?.corpId,i=r?.agentId,a=new URL("https://app.fmode.cn"+location.pathname+location?.search);a.searchParams.delete("code"),a.searchParams.delete("state");let n=encodeURIComponent(a.href),s=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${o}&redirect_uri=${n}&response_type=code&scope=${e}&state=STATE&agentid=${i}#wechat_redirect`;if("h5"==this.platform()){if(location.host?.startsWith("localhost"))return"";s=`https://login.work.weixin.qq.com/wwlogin/sso/login?login_type=CorpApp&appid=${o}&agentid=${i}&redirect_uri=${n}&state=WWLogin`,console.log("createWWLoginPanel")}return location.href=s,null}async getCorpByCid(e){if(console.log("cid",e),this.corpId)return this.corpId;let t=new Parse.Query("CloudResource"),r=(await t.get(this.companyMap[e]?.corpResId)).get("config");return console.log("config",r),r}async registerCorpWithSuite(e,t,r){if("wxwork"!=this.platform())return!1;if(!r?.length&&this.registerUrl==location.href)return!0;r=r||jsApiList;try{e=e||this.cid,t=t||this.appId;let o=await this.getCorpByCid(e);console.log(o);let i=o?.corpId,a=this.suiteMap[t]?.suiteId;console.log(i,a);let n=new Date,s=new Promise((e=>{ww.register({corpId:o.corpId,suiteId:a,agentId:o.agentId,jsApiList:r,getAgentConfigSignature:async()=>{let e=await this.wecorp.ticket.get();return ww.getSignature({ticket:e,nonceStr:"666",timestamp:(n.getTime()/1e3).toFixed(0),url:location.href})},onAgentConfigSuccess:()=>{this.registerUrl=location.href,e(!0)},onAgentConfigFail:t=>{e(!1)},onConfigFail:t=>{e(!1)}})}));return await s}catch(e){return wxdebug(JSON.stringify(e)),!1}}getUA(){return this.ua=navigator.userAgent.toLowerCase(),this.ua}platform(){return this.ua=navigator.userAgent.toLowerCase(),this.ua.indexOf("wxwork")>-1?"wxwork":this.ua.indexOf("wechat")>-1?"wechat":"h5"}async getContext(){await this.registerCorpWithSuite();try{let e=await ww.getContext();return e?.entry&&(this.entry=e?.entry),e}catch(e){this.entryError="请先注册JSAPI"+e.errCode+e.errMsg,console.error(e)}return null}async getCurrentChat(){let e;if(!await this.registerCorpWithSuite())return null;try{e=await ww.getContext()}catch(e){console.error(e)}let t,r,o,i,a=e?.entry;try{return"group_chat_tools"==a&&(t="chatId",r=(await ww.getCurExternalChat())?.chatId,i=await this.wecorp.externalContact.groupChat.get(r)),"contact_profile"!=a&&"single_chat_tools"!=a||(t="userId",r=(await ww.getCurExternalContact())?.userId,o=await this.wecorp.externalContact.get(r)),this.currentChat={type:t,id:r,group:i?.group_chat,contact:o?.external_contact,follow_user:o?.follow_user},this.currentChat}catch(e){return wxdebug(JSON.stringify(e)),null}}version(){return wxdebug(ww.SDK_VERSION),ww.SDK_VERSION}register(){ww.register({corpId:"ww7ca4776b2a70000",jsApiList:["getExternalContact"],getConfigSignature:this.getConfigSignature})}async getConfigSignature(e){return{timestamp:"",nonceStr:"",signature:""}}config(){}async selectEnterpriseContact(){let e=await ww.selectEnterpriseContact({fromDepartmentId:-1,mode:"multi",type:["department","user"]});console.log(e),wxdebug(e)}}export const jsApiList=["getContext","getCurExternalChat","getCurExternalContact","createCorpGroupChat","updateCorpGroupChat","checkJsApi","onMenuShareAppMessage","onMenuShareWechat","onMenuShareTimeline","shareAppMessage","shareWechatMessage","startRecord","stopRecord","onVoiceRecordEnd","playVoice","pauseVoice","stopVoice","uploadVoice","downloadVoice","chooseImage","previewImage","uploadImage","downloadImage","getNetworkType","openLocation","getLocation","hideOptionMenu","showOptionMenu","hideMenuItems","showMenuItems","hideAllNonBaseMenuItem","showAllNonBaseMenuItem","closeWindow","scanQRCode","previewFile","openEnterpriseChat","selectEnterpriseContact","onHistoryBack","openDefaultBrowser"];
|
|
8
|
+
import*as ww from"@wecom/jssdk";import{FmodeParse}from"../../parse";const Parse=FmodeParse.with("nova");import{WxworkCorp}from"./wxwork.corp";import{wxdebug}from"../wxdebug";import{createLoginContainer,removeLoginContainer}from"./login-modal";export class WxworkSDK{constructor(e){this.companyMap={E4KpGvTEto:{corpResId:"vsVIWbd1i9"},uRiDGwEYLi:{corpResId:"JxfFXBr0ly"},cDL6R1hgSi:{corpResId:"SpL6gyD1Gu"}},this.suiteMap={crm:{suiteId:"dk2559ba758f33d8f5"}},this.ww=ww,this.groupChat={createGroupChat:async e=>{try{return wxdebug("createGroupChat"+JSON.stringify(e)),await this.registerCorpWithSuite()?new Promise(((t,r)=>{e.success=e=>{wxdebug(JSON.stringify(e)),t(e)},e.fail=e=>{wxdebug(JSON.stringify(e)),r(e)},ww.createCorpGroupChat(e)})):null}catch(e){wxdebug(JSON.stringify(e))}},addUserInfoGroup:async e=>{wxdebug("addUserInfoGroup"+JSON.stringify(e));try{let t=await this.registerCorpWithSuite();return wxdebug("isRegister"+t),t?(wxdebug(JSON.stringify(e)),new Promise(((t,r)=>{e.success=e=>{wxdebug(JSON.stringify(e)),t(e)},e.fail=e=>{wxdebug(JSON.stringify(e)),r(e)},ww.updateCorpGroupChat(e)}))):null}catch(e){wxdebug(JSON.stringify(e))}}},this.cid=e?.cid,this.appId=e?.appId,this.wecorp=new WxworkCorp(this.cid)}async syncGroupChat(e){let t=new Parse.Query("GroupChat");t.equalTo("chat_id",e?.chat_id);let r=await t.first();if(r?.id||(r=new Parse.Object("GroupChat")),!r?.get("joinUrl")){let t=(await this.wecorp.externalContact.groupChat.addJoinWay({scene:1,chat_id_list:[e.chat_id]}))?.config_id,o=(await this.wecorp.externalContact.groupChat.getJoinWay(t))?.join_way;r.set("joinUrl",o)}if(!r?.get("joinQrcode")){let t=(await this.wecorp.externalContact.groupChat.addJoinWay({scene:2,chat_id_list:[e.chat_id]}))?.config_id,o=(await this.wecorp.externalContact.groupChat.getJoinWay(t))?.join_way;r.set("joinQrcode",o)}let o={chat_id:e.chat_id,name:e.name,owner:e.owner,notice:e.notice},i=!1;return r.get("chat_id")!=e.chat_id&&(i=!0),r.get("name")!=e.name&&(i=!0),r.get("owner")!=e.owner&&(i=!0),r.get("notice")!=e.notice&&(i=!0),r.get("member_version")!=e.member_version&&(i=!0,o.member_list=e.member_list,o.member_version=e.member_version),r.set(o),this.cid&&r.set("company",{__type:"Pointer",className:"Company",objectId:this.cid}),i&&(r=await r.save()),r}async syncContact(e){const t=e.external_contact||e,r=t.external_userid;let o=new Parse.Query("ContactInfo");o.equalTo("external_userid",r);const i=new Parse.Object("Company");i.id=this.cid,o.equalTo("company",i);let a=await o.first();a?.id||(a=new Parse.Object("ContactInfo"),i?.id&&a.set("company",i.toPointer()));const n=t.name||"",s=t.mobile||"",c={...t,follow_user:e.follow_user||t.follow_user||[]};let l=!1;a.get("external_userid")!=r&&(l=!0),a.get("name")!=n&&n&&(l=!0),a.get("mobile")!=s&&s&&(l=!0);const d=a.get("data");return JSON.stringify(d)!==JSON.stringify(c)&&(l=!0),a.set("external_userid",r),a.set("name",n),a.set("mobile",s),a.set("data",c),wxdebug("syncContact",a.toJSON()),l&&(a=await a.save()),a}async getCurrentChatObject(){const e=await this.getCurrentChat();if(!e)return{currentChat:null};let t,r;try{if("chatId"===e.type&&e.group)t=await this.syncGroupChat(e.group);else if("userId"===e.type&&e.id){const t=await this.wecorp.externalContact.get(e.id);r=await this.syncContact(t)}}catch(e){console.error("getCurrentChatObject error:",e)}return{GroupChat:t,Contact:r,currentChat:e}}async syncUserInfo(e){let t=null;1==e.gender&&(t="男"),2==e.gender&&(t="女");let r=await this.getContactOrProfile(e);console.log("thisUser",r),console.log("userInfo",e),"ContactInfo"==r.className&&r.set({data:{openid:e.openid,userid:e.userid,external_userid:e.external_userid,type:e.type&&String(e.type)||null,name:e.name,avatar:e.avatar,gender:t,qr_code:e.qr_code,mobile:e.mobile,email:e.email,biz_mail:e.biz_mail,address:e.address,position:e.position,corp_name:e.corp_name},type:"wecom-agency",company:{__type:"Pointer",className:"Company",objectId:this.cid}}),"Profile"==r.className&&(r.set({openid:e.openid,userid:e.userid,external_userid:e.external_userid,type:e.type&&String(e.type)||null,name:e.name,avatar:e.avatar,gender:t,qr_code:e.qr_code,mobile:e.mobile,email:e.email,biz_mail:e.biz_mail,address:e.address,position:e.position,corp_name:e.corp_name,company:{__type:"Pointer",className:"Company",objectId:this.cid}}),r.set("data",e));try{if(r?.id&&!r.get("user")?.id){let e=Parse.User.current();e?.id&&r.set("user",e?.toPointer())}r=await r.save()}catch(e){wxdebug(e)}return r}async getUserinfo(e){let t,r;wxdebug("getUserinfo");let o=localStorage.getItem(`${this.cid}/USERINFO`);if(!e){t=JSON.parse(o),t.cid=this.cid,wxdebug("getContactOrProfile");try{r=await this.getContactOrProfile(t)}catch(e){}if(wxdebug("getUserinfo:"+o),t&&r)return t}if(!(e=new URL(location.href).searchParams.get("code")||e))return null;let i=await this.wecorp.auth.getuserinfo(e);if(wxdebug("result"+JSON.stringify(i)),i?.errcode)return console.error(i?.errmsg),null;let a=i?.external_userid;if(a){let e=await this.wecorp.externalContact.get(a);e?.external_contact&&Object.keys(e?.external_contact).forEach((t=>{i[t]=e?.external_contact[t]}))}return i.cid=this.cid,t=i,r=await this.getContactOrProfile(t),r?.get("mobile")&&(t.mobile=r?.get("mobile")),o=JSON.stringify(i),localStorage.setItem(`${this.cid}/USERINFO`,o),t}async getCurrentUser(){const e=await this.getUserinfo();if(!e)return null;return await this.getContactOrProfile(e)}async getContactOrProfile(e){let t;(e.openid||e.external_userid)&&(t="ContactInfo"),e.userid&&(t="Profile");let r=[];"Profile"==t&&(e.openid&&r.push({openid:{$regex:e.openid}}),e.userid&&r.push({userid:{$regex:e.userid}}),e.mobile&&r.push({mobile:{$regex:e.mobile}}),e.email&&r.push({email:{$regex:e.email}}),e.external_userid&&r.push({external_userid:{$regex:e.external_userid}})),"ContactInfo"==t&&(e.openid&&r.push({"data.openid":{$regex:e.openid}}),e.userid&&r.push({"data.userid":{$regex:e.userid}}),e.mobile&&r.push({"data.mobile":{$regex:e.mobile}}),e.email&&r.push({"data.email":{$regex:e.email}}),e.external_userid&&r.push({"data.external_userid":{$regex:e.external_userid}}));let o,i=Parse.Query.fromJSON(t,{where:{$or:r}});i.equalTo("company",this.cid),i.equalTo("userid",e.userid);try{o=await i.first()}catch(e){console.error(e)}o?.id||(o=new Parse.Object(t));let a=Parse.User.current();return a?.id&&(o?.get("user")?.id||o.set("user",a.toPointer())),o}async loginPC(){let e=await this.getCorpByCid(this.cid);console.log(this.cid,e);const t=e?.corpId,r=e?.agentId,o=new URL("https://app.fmode.cn"+location.pathname+location?.search);o.searchParams.delete("code"),o.searchParams.delete("state");const i=o.href,a=ww.WWLoginType.corpApp,n=ww.WWLoginRedirectType.callback;console.log("loginPC1");return document.getElementById("ww_login")||createLoginContainer(),new Promise(((e,o)=>{console.log("loginPC2");const s=this.ww.createWWLoginPanel({el:"#ww_login",params:{login_type:a,appid:t,agentid:r,redirect_uri:i,state:"loginState",redirect_type:n},onCheckWeComLogin({isWeComLogin:e}){console.log(e)},onLoginSuccess({code:t}){console.log({code:t}),removeLoginContainer(),e(t)},onLoginFail(e){console.error("lpc",e),removeLoginContainer(),o(e)}});console.log(s,s.el)}))}async oauth(e="snsapi_base",t=!1){t&&localStorage.removeItem(`${this.cid}/USERINFO`),wxdebug("oauth");let r=await this.getCorpByCid(this.cid);console.log(this.cid,r);let o=r?.corpId,i=r?.agentId,a=new URL("https://app.fmode.cn"+location.pathname+location?.search);a.searchParams.delete("code"),a.searchParams.delete("state");let n=encodeURIComponent(a.href),s=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${o}&redirect_uri=${n}&response_type=code&scope=${e}&state=STATE&agentid=${i}#wechat_redirect`;if("h5"==this.platform()){if(location.host?.startsWith("localhost"))return"";s=`https://login.work.weixin.qq.com/wwlogin/sso/login?login_type=CorpApp&appid=${o}&agentid=${i}&redirect_uri=${n}&state=WWLogin`,console.log("createWWLoginPanel")}return location.href=s,null}async getCorpByCid(e){if(console.log("cid",e),this.corpId)return this.corpId;let t=new Parse.Query("CloudResource"),r=(await t.get(this.companyMap[e]?.corpResId)).get("config");return console.log("config",r),r}async registerCorpWithSuite(e,t,r){if("wxwork"!=this.platform())return!1;if(!r?.length&&this.registerUrl==location.href)return!0;r=r||jsApiList;try{e=e||this.cid,t=t||this.appId;let o=await this.getCorpByCid(e);console.log(o);let i=o?.corpId,a=this.suiteMap[t]?.suiteId;console.log(i,a);let n=new Date,s=new Promise((e=>{ww.register({corpId:o.corpId,suiteId:a,agentId:o.agentId,jsApiList:r,getAgentConfigSignature:async()=>{let e=await this.wecorp.ticket.get();return ww.getSignature({ticket:e,nonceStr:"666",timestamp:(n.getTime()/1e3).toFixed(0),url:location.href})},onAgentConfigSuccess:()=>{this.registerUrl=location.href,e(!0)},onAgentConfigFail:t=>{e(!1)},onConfigFail:t=>{e(!1)}})}));return await s}catch(e){return wxdebug(JSON.stringify(e)),!1}}getUA(){return this.ua=navigator.userAgent.toLowerCase(),this.ua}platform(){return this.ua=navigator.userAgent.toLowerCase(),this.ua.indexOf("wxwork")>-1?"wxwork":this.ua.indexOf("wechat")>-1?"wechat":"h5"}async getContext(){await this.registerCorpWithSuite();try{let e=await ww.getContext();return e?.entry&&(this.entry=e?.entry),e}catch(e){this.entryError="请先注册JSAPI"+e.errCode+e.errMsg,console.error(e)}return null}async getCurrentChat(){let e;if(!await this.registerCorpWithSuite())return null;try{e=await ww.getContext()}catch(e){console.error(e)}let t,r,o,i,a=e?.entry;try{return"group_chat_tools"==a&&(t="chatId",r=(await ww.getCurExternalChat())?.chatId,i=await this.wecorp.externalContact.groupChat.get(r)),"contact_profile"!=a&&"single_chat_tools"!=a||(t="userId",r=(await ww.getCurExternalContact())?.userId,o=await this.wecorp.externalContact.get(r)),this.currentChat={type:t,id:r,group:i?.group_chat,contact:o?.external_contact,follow_user:o?.follow_user},this.currentChat}catch(e){return wxdebug(JSON.stringify(e)),null}}version(){return wxdebug(ww.SDK_VERSION),ww.SDK_VERSION}register(){ww.register({corpId:"ww7ca4776b2a70000",jsApiList:["getExternalContact"],getConfigSignature:this.getConfigSignature})}async getConfigSignature(e){return{timestamp:"",nonceStr:"",signature:""}}config(){}async selectEnterpriseContact(){let e=await ww.selectEnterpriseContact({fromDepartmentId:-1,mode:"multi",type:["department","user"]});console.log(e),wxdebug(e)}}export const jsApiList=["getContext","getCurExternalChat","getCurExternalContact","createCorpGroupChat","updateCorpGroupChat","checkJsApi","onMenuShareAppMessage","onMenuShareWechat","onMenuShareTimeline","shareAppMessage","shareWechatMessage","startRecord","stopRecord","onVoiceRecordEnd","playVoice","pauseVoice","stopVoice","uploadVoice","downloadVoice","chooseImage","previewImage","uploadImage","downloadImage","getNetworkType","openLocation","getLocation","hideOptionMenu","showOptionMenu","hideMenuItems","showMenuItems","hideAllNonBaseMenuItem","showAllNonBaseMenuItem","closeWindow","scanQRCode","previewFile","openEnterpriseChat","selectEnterpriseContact","onHistoryBack","openDefaultBrowser"];
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3NvY2lhbC93eHdvcmsvd3h3b3JrLnNkay5tanM=`
|
|
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/core/storage/gen-file-key.mjs
|
|
7
|
+
*/
|
|
8
|
+
export function genFileKey(t,e,n){const r=new Date,a=r.getFullYear(),g=String(r.getMonth()+1).padStart(2,"0"),S=String(r.getDate()).padStart(2,"0"),$=String(r.getHours()).padStart(2,"0"),i=String(r.getMinutes()).padStart(2,"0"),o=String(r.getSeconds()).padStart(2,"0"),d=Math.random().toString(36).slice(2,8);return`storage/company/${e||"undefined"}/${n?`${n.replace(/^\/+|\/+$/g,"")}/`:""}${a}${g}${S}/${$}${i}${o}-${d}-${t}`}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvZ2VuLWZpbGUta2V5Lm1qcw==`
|
|
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/core/storage/hwobs.provider.mjs
|
|
7
|
+
*/
|
|
8
|
+
import ObsClient from"esdk-obs-browserjs";export class HwobsProvider{constructor(e){this.conf=e,this.client=new ObsClient({access_key_id:e.access_key_id,secret_access_key:e.secret_access_key,server:e.server})}setConfig(e){this.conf=e,this.client=new ObsClient({access_key_id:e.access_key_id,secret_access_key:e.secret_access_key,server:e.server})}genFileKey(e){const t=new Date;return`storage/web-2023/${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}/${String(t.getHours()).padStart(2,"0")}${String(t.getMinutes()).padStart(2,"0")}${String(t.getSeconds()).padStart(2,"0")}-${Math.random().toString(36).slice(2,8)}-${e}`}async upload(e,t){const s=e.name||"blob.bin",r=t?.key||this.genFileKey(s);return new Promise(((t,c)=>{this.client.putObject({Bucket:this.conf.bucket,Key:r,SourceFile:e},((i,n)=>{if(i)c(i);else{const c=this.conf.host||"",i={key:r,url:c?`${c}${r}`:r,name:s,type:e.type||"",size:e.size||0};t(i)}}))}))}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvaHdvYnMucHJvdmlkZXIubWpz`
|
|
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/core/storage/index.mjs
|
|
7
|
+
*/
|
|
8
|
+
export*from"./types";export*from"./nova-storage";export*from"./qiniu.provider";export*from"./hwobs.provider";export*from"./util-file-md5";export*from"./util-file-metadata";
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvaW5kZXgubWpz`
|
|
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/core/storage/nova-storage.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{QiniuProvider}from"./qiniu.provider";import{FmodeParse}from"../parse";import{calcFileMd5}from"./util-file-md5";import{getFileMetadata}from"./util-file-metadata";import{genFileKey}from"./gen-file-key";const Parse=FmodeParse.with("nova");export class NovaStorage{constructor(e){this.provider=e}setProvider(e){this.provider=e}async initByCid(e,t){this.cid=e,this.provider=await this.selectProvider(e,t)}static async withCid(e,t){const i=new NovaStorage;return await i.initByCid(e,t),i}async selectProvider(e,t){if("hwobs"===t)throw new Error("Hwobs requires explicit configuration. Use setProvider(new HwobsProvider(conf)).");const i=await this.fetchQiniuConf(e);return new QiniuProvider(i)}async fetchQiniuConf(e){const t=await Parse.Cloud.run("qiniu_uptoken",{company:e});if(!t?.uptoken||!t?.domain)throw new Error("qiniu_uptoken returned invalid config");return{uptoken:t.uptoken,domain:t.domain,useCdnDomain:!0,forceDirect:!0}}async upload(e,t){if(!this.provider)throw new Error("NovaStorage provider is not set");let i=await calcFileMd5(e),a=await getFileMetadata(e),r={id:"",name:"",type:"",size:0,key:"",url:""},o=await this.getAttachmentByMd5(i);if(o?.id)return r.id=o?.id,r.url=o?.get("url"),r.name=o?.get("name"),r.md5=o?.get("md5"),r.type=o?.get("mime"),r.size=o?.get("size"),r.metadata=o?.get("metadata"),r;const n={...t};!n.key&&e?.name&&(n.key=genFileKey(e.name,this.cid||"",n.prefixKey)),console.log(n);let s=await this.provider.upload(e,n);return s.md5=i,s.metadata=a,o=await this.saveAttachment(s),s.id=o.id,s}async getAttachmentByMd5(e){if(!e)return null;const t=new Parse.Query("Attachment");t.equalTo("md5",e),t.addDescending("createdAt");return await t.first()}async saveAttachment(e,t,i,a,r){const o=e.md5||(r?await calcFileMd5(r):void 0);let n=e.url||"";n&&!n.startsWith("http")&&(n=(t||"")+n),n=n.replace(/undefined\//,"");const s=Parse.User.current(),d=new Parse.Object("Attachment");d.set("size",e.size),d.set("url",n),d.set("name",e.name),d.set("mime",e.type),o&&d.set("md5",o),e.metadata&&d.set("metadata",e.metadata);const c=a||this.cid||localStorage.getItem("company")||void 0;c&&d.set("company",{__type:"Pointer",className:"Company",objectId:c}),i&&d.set("category",{__type:"Pointer",className:"Category",objectId:i}),s?.id&&d.set("user",s.toPointer?s.toPointer():{__type:"Pointer",className:"_User",objectId:s.id});return await d.save()}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2Uvbm92YS1zdG9yYWdlLm1qcw==`
|
|
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/core/storage/qiniu.provider.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{genFileKey}from"./gen-file-key";import*as qiniu from"qiniu-js";export class QiniuProvider{constructor(e){this.conf=e}setConfig(e){this.conf=e}async upload(e,i){const n=qiniu||window.qiniu||void 0;if(!n)throw new Error("qiniu-js is not available on window");const o=e.name||"blob.bin",s=i?.key||genFileKey(o,"undefined"),r={fname:o,params:{},mimeType:e.type||void 0},t={useCdnDomain:this.conf.useCdnDomain??!0,forceDirect:this.conf.forceDirect??!0};return new Promise(((c,a)=>{n.upload(e,s,this.conf.uptoken,r,t).subscribe({next:e=>{i?.onProgress?.(e)},error:e=>{a(e)},complete:i=>{const n=`${this.conf.domain}${i.key}`,s={key:i.key,url:n,name:o,type:e.type||"",size:e.size||(i.size??0)};c(s)}})}))}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvcWluaXUucHJvdmlkZXIubWpz`
|
|
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/core/storage/types.mjs
|
|
7
|
+
*/
|
|
8
|
+
export{};
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvdHlwZXMubWpz`
|
|
10
|
+
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
4
|
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
|
-
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/storage/util-file-md5.mjs
|
|
7
7
|
*/
|
|
8
|
-
import SparkMD5 from"spark-md5";export function calcFileMd5(r){return new Promise(((e,o)=>{const
|
|
9
|
-
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+
|
|
8
|
+
import*as SparkMD5 from"spark-md5";export function calcFileMd5(r){return new Promise(((e,o)=>{const a=new FileReader;a.onload=r=>{try{const a=r.target?.result;if(a){const r=new SparkMD5.ArrayBuffer;r.append(a);const o=r.end();e(o)}else o(new Error("Failed to load file"))}catch(r){o(r)}},a.onerror=r=>o(r),a.readAsArrayBuffer(r)}))}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvdXRpbC1maWxlLW1kNS5tanM=`
|
|
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/core/storage/util-file-metadata.mjs
|
|
7
|
+
*/
|
|
8
|
+
export async function getFileMetadata(t){const e={name:t.name,size:t.size,type:t.type,lastModified:t.lastModified??Date.now(),metadata:{}};return e.metadata.lastModified=e.lastModified,t.type.startsWith("image/")?await extractImageMetadata(t,e.metadata):(t.type.startsWith("audio/")||t.type.startsWith("video/"))&&await extractMediaMetadata(t,e.metadata),e}async function extractImageMetadata(t,e){try{const a=new Image,i=URL.createObjectURL(t);await new Promise(((t,e)=>{a.onload=()=>t(),a.onerror=e,a.src=i})),e.width=a.naturalWidth,e.height=a.naturalHeight,URL.revokeObjectURL(i)}catch(t){console.error("提取图片元数据失败:",t)}}async function extractMediaMetadata(t,e){try{const a=t.type.startsWith("audio/")?new Audio:document.createElement("video"),i=URL.createObjectURL(t);await new Promise(((t,e)=>{a.onloadedmetadata=()=>t(),a.onerror=e,a.src=i})),e.duration=a.duration,"videoWidth"in a&&(e.width=a.videoWidth),"videoHeight"in a&&(e.height=a.videoHeight),URL.revokeObjectURL(i)}catch(t){console.error("提取媒体元数据失败:",t)}}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3N0b3JhZ2UvdXRpbC1maWxlLW1ldGFkYXRhLm1qcw==`
|
|
10
|
+
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/social/wxwork/wxwork-auth.guard.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{
|
|
8
|
+
import{checkWeworkLogin}from"../../core/social/wxwork/wxwork.auth";export const WxworkAuthGuard=async(o,r)=>checkWeworkLogin(o);
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zb2NpYWwvd3h3b3JrL3d4d29yay1hdXRoLmd1YXJkLm1qcw==`
|
|
10
10
|
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* 保留所有权利 All Rights Reserved.
|
|
6
6
|
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/nova-upload.service.mjs
|
|
7
7
|
*/
|
|
8
|
-
import{DatePipe}from"@angular/common";import{Injectable}from"@angular/core";import{Platform}from"@ionic/angular";import{Camera,CameraResultType,CameraSource}from"@capacitor/camera";import{Capacitor}from"@capacitor/core";import{Filesystem}from"@capacitor/filesystem";import{FilesystemWeb}from"@capacitor/filesystem/dist/esm/web.js";import
|
|
8
|
+
import{DatePipe}from"@angular/common";import{Injectable}from"@angular/core";import{Platform}from"@ionic/angular";import{Camera,CameraResultType,CameraSource}from"@capacitor/camera";import{Capacitor}from"@capacitor/core";import{Filesystem}from"@capacitor/filesystem";import{FilesystemWeb}from"@capacitor/filesystem/dist/esm/web.js";import{FmodeParse}from"../../core/parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import CryptoJS from"crypto-js";import{NovaStorage,QiniuProvider,calcFileMd5,getFileMetadata}from"../../core/storage";import{MediaCapture}from"@awesome-cordova-plugins/media-capture/ngx";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@awesome-cordova-plugins/diagnostic/ngx";const Parse=FmodeParse.with("nova");export class NovaUploadService{constructor(t,e){this.platform=t,this.diagnostic=e,this.maxSize=5242880,this.getUptoken(!0),this.requestPermission(),this.queryDomain()}async upload(t,e){const i=t.type,a=t.name?.split(".")?.pop()||"";let o={id:"",name:"",type:"",size:0,key:"",url:""};const r=await this.getFileMd5(t);if(!this.storage)try{this.storage=await NovaStorage.withCid(this.getCompanyId())}catch{this.ensureStorage()}const s=await(this.storage?.getAttachmentByMd5(r));if(s?.id)o.url=s?.get("url"),o.name=s?.get("name"),o.type=s?.get("mime"),o.size=s?.get("size"),o.metadata=s?.get("metadata"),e&&e({total:{loaded:o.size,size:o.size,percent:100}});else{const r=this.fileToBlob(t);o=i.indexOf("image")>-1?await this.saveQiniuImageFile(r,a,null,e):await this.saveQiniuMediaFile(t,r,null,e)}o?.url?.indexOf("undefined")>-1&&(o.url=(this.qiniuDomain||"https://file-cloud.fmode.cn/")+o.url.replace("undefined/",""));const n=(await getFileMetadata(t)).metadata;let l;return o.metadata={...o.metadata||{},...n},o?.url&&(l=await(this.storage?.saveAttachment(o,this.qiniuDomain,null,this.getCompanyId(),t))),l?.id&&(o.id=l?.id),o.attachment=l,o}async getAttachByMd5(t){if(!t)return null;if(!this.storage)try{this.storage=await NovaStorage.withCid(this.getCompanyId())}catch{this.ensureStorage()}return this.storage?.getAttachmentByMd5(t)}isCapacitor(){return this.platform.is("capacitor")||this.platform.is("cordova")}async getFileMd5(t){let e;try{e=await calcFileMd5(t),console.log("md5File",e)}catch(t){console.error(t)}return e}async requestPermission(){this.isCapacitor()&&(await this.requestStoagePermission(),await this.requestCameraPermission())}async requestStoagePermission(){let t=await this.diagnostic.isExternalStorageAuthorized();if(console.log("permisson_STORAGE:",t),!t){await this.diagnostic.requestExternalStorageAuthorization()}}async requestCameraPermission(){let t=await this.diagnostic.isCameraAuthorized();if(console.log("permisson_Camera:",t),!t){await this.diagnostic.requestCameraAuthorization()}}async getUptoken(t=!1){if(console.log("getUptoken"),!this.qiniuConf||t)try{console.log(this.getCompanyId());let t=await Parse.Cloud.run("qiniu_uptoken",{company:this.getCompanyId()});console.log(t),this.qiniuConf=t,this.qiniuProviderConf={uptoken:this.qiniuConf?.uptoken,domain:this.qiniuConf?.domain,useCdnDomain:!0,forceDirect:!0},this.ensureStorage()}catch(t){console.error(t)}}ensureStorage(){if(this.qiniuProviderConf){const t=new QiniuProvider(this.qiniuProviderConf);this.storage=new NovaStorage(t)}}genFileKey(t,e){let i=new Date,a=new DatePipe("en");e||(e=this.getCompanyId());let o="storage/company/"+e+"/";return this.store?.id&&this.store?.id,o+""+(a.transform(i,"yMMdd")+"/"+String(t.id).substr(20,6)+a.transform(i,"hhmmssSSS")+/\.[^\.]+/.exec(t.name))}getCompanyId(){if(this.company)return this.company;return localStorage.getItem("company")}async queryDomain(){let t=new Parse.Query("Company"),e=await t.get(this.getCompanyId());e.get("configQiniu")&&e.get("configQiniu").domain?(console.log(e.get("configQiniu").domain),this.qiniuDomain=e.get("configQiniu").domain):this.qiniuDomain="https://file-cloud.fmode.cn"}async saveAttachment(t,e,i,a,o){if(!this.storage)try{this.storage=await NovaStorage.withCid(this.getCompanyId())}catch{this.ensureStorage()}return await(this.storage?.saveAttachment(t,e,i,a,o))}async captureVideo(t){if(this.qiniuConf=t,!this.isCapacitor())return;let e=await this.cameraCaptureVideoFile(),i=await this.getMediaFileDataString(e);return await this.saveQiniuMediaFile(e,i)}async cameraCaptureVideoFile(){let t=MediaCapture,e=await t.captureVideo({limit:1});return e?.length>0?e[0]:null}async getMediaFileDataString(t){new FilesystemWeb,t.fullPath.replaceAll("///","//");let e=await Filesystem.stat({path:t.fullPath}),i=Capacitor.convertFileSrc(e.uri),a=await fetch(i),o=await a.blob();if(console.log(o.size),console.log(JSON.stringify(e)),console.log(JSON.stringify(a)),console.log(JSON.stringify(Object.keys(a))),o)return o;throw"读取文件失败"}async takePicture(t){if(this.qiniuConf=t,!this.isCapacitor())return;await this.getUptoken();let e=await this.cameraTakePictureDataUrl();if(!e?.dataUrl)return;let i=await this.base64ToBlob(e?.dataUrl),a=await this.saveQiniuImageFile(i,e?.format);return console.log(JSON.stringify(a)),a}async cameraTakePictureDataUrl(){if(!this.isCapacitor())return;return await Camera.getPhoto({quality:90,allowEditing:!1,source:CameraSource.Camera,resultType:CameraResultType.DataUrl})}async saveQiniuImageFile(t,e,i,a){let o=this.maxSize;if(t.size>o)throw await console.log("照片过大,超出限制5MB"),"超出文件大小";let r=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),s=`${r}.${e}`,n=t.type;const l=new File([t],s,{type:n}),c=this.genFileKey({id:r,name:s});if(this.storage||this.ensureStorage(),!this.storage)throw"Storage provider not initialized";return{...await this.storage.upload(l,{key:c,onProgress:t=>a&&a(t)}),name:s,type:n,size:t.size}}async saveQiniuMediaFile(t,e,i,a){let o=t.name,r=t.type,s=t.size;if(s>(this.maxSize||104857600))throw console.log("视频过大,超出限制100MB"),"超出文件大小";let n=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss");const l=new File([e],o,{type:r}),c=this.genFileKey({id:n,name:o});if(this.storage||this.ensureStorage(),!this.storage)throw"Storage provider not initialized";return{...await this.storage.upload(l,{key:c,onProgress:t=>a&&a(t)}),name:o,type:r,size:s}}async base64ToBlobType(t,e){let i=await fetch(`data:${e};base64,${t}`);return await i.blob()}async base64ToBlob(t){let e=await fetch(t);return await e.blob()}fileToBlob(t){const e=t.slice(0,t.size,t.type);return new Blob([e],{type:t.type})}genMd5(t){return CryptoJS.MD5(t).toString()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,deps:[{token:i1.Platform},{token:i2.Diagnostic}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Diagnostic}]});
|
|
9
9
|
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2UubWpz`
|
|
10
10
|
|