{"version":3,"sources":["assets/image/file/folder.svg","assets/image/file/pdf.svg","assets/image/file/doc.svg","assets/image/file/ppt.svg","assets/image/file/xls.svg","assets/image/file/audio.svg","assets/image/file/video.svg","assets/image/file/text.svg","assets/image/file/psd.svg","assets/image/file/image.svg","assets/image/file/file.svg","assets/image/logo.png","common/component/TankComponent.tsx","common/util/SafeUtil.ts","common/util/StringUtil.ts","common/model/base/SortDirection.ts","common/model/base/filter/Filter.ts","common/model/base/filter/SortFilter.ts","common/util/HttpUtil.ts","common/util/DateUtil.ts","common/util/JsonUtil.ts","common/util/ObjectUtil.ts","common/model/base/Base.ts","common/model/base/WebResultCode.ts","common/model/base/ViewBase.ts","common/model/global/Sun.ts","common/util/MessageBoxUtil.ts","common/model/base/HttpBase.ts","common/model/base/option/Color.ts","common/model/base/BaseEntity.ts","common/model/user/UserRole.ts","common/util/BrowserUtil.ts","common/model/global/i18n/LangEn.ts","common/model/global/i18n/LangZh.ts","common/model/global/Lang.ts","common/model/user/UserStatus.ts","common/util/NumberUtil.ts","common/util/MimeUtil.ts","common/util/ImageUtil.ts","common/model/base/filter/SelectionFilterType.ts","common/model/base/filter/InputFilter.ts","common/model/base/filter/SelectionFilter.ts","common/model/user/User.ts","common/model/preference/model/ScanScopeType.ts","common/model/preference/model/PreviewEngine.ts","common/model/preference/model/PreviewConfig.ts","common/model/preference/model/ScanCronType.ts","common/model/preference/model/ScanConfig.ts","common/model/preference/Preference.ts","common/model/global/Moon.ts","pages/user/Login.tsx","pages/user/Register.tsx","common/model/base/Pager.ts","common/util/FileUtil.ts","pages/widget/filter/InputFilterBox.tsx","common/model/base/filter/DateTimeFilter.ts","pages/widget/filter/DateTimeFilterBox.tsx","common/model/base/filter/CheckFilter.ts","pages/widget/filter/CheckFilterBox.tsx","pages/widget/filter/SelectionFilterBox.tsx","pages/widget/filter/SortFilterBox.tsx","common/model/base/filter/HttpSelectionFilter.ts","pages/widget/filter/HttpSelectionFilterBox.tsx","pages/widget/filter/DateFilterBox.tsx","common/model/base/filter/DateFilter.ts","pages/widget/filter/FilterPanel.tsx","pages/widget/TableEmpty.tsx","pages/widget/TankTitle.tsx","common/util/ClipboardUtil.ts","pages/user/widget/TransfigurationModal.tsx","pages/user/List.tsx","pages/widget/InfoCell.tsx","pages/widget/Expanding.tsx","pages/user/widget/MobileUserPanel.tsx","pages/user/MobileList.tsx","pages/widget/TankContentCard.tsx","pages/widget/previewer/ImagePreviewer.tsx","pages/widget/SingleTextModal.tsx","pages/user/widget/ChangePasswordModal.tsx","pages/user/Detail.tsx","common/util/EnvUtil.ts","pages/widget/previewer/BrowserPreviewer.tsx","common/model/download/token/DownloadToken.ts","pages/widget/previewer/PreviewerHelper.ts","common/model/matter/Matter.ts","pages/matter/widget/UploadMatterPanel.tsx","pages/matter/widget/MatterImage.tsx","pages/user/Edit.tsx","pages/user/Authentication.tsx","pages/preference/widget/PreviewEngineCell.tsx","pages/preference/Index.tsx","pages/preference/Edit.tsx","pages/preference/widget/PreviewEngineEditCell.tsx","pages/preference/widget/PreviewConfigPanel.tsx","pages/preference/PreviewEngineEdit.tsx","pages/preference/ScanEdit.tsx","pages/dashboard/widget/RatePanel.tsx","common/model/dashboard/Dashboard.ts","pages/dashboard/Index.tsx","common/model/install/Install.ts","pages/install/widget/SetAdminPanel.tsx","pages/install/widget/MysqlPanel.tsx","pages/install/widget/CreateTablePanel.tsx","pages/install/widget/inner/PhaseSelectingPanel.tsx","pages/install/widget/inner/PhaseVerifyPanel.tsx","pages/install/widget/inner/PhaseCreatePanel.tsx","pages/install/widget/FinishPanel.tsx","pages/install/Index.tsx","pages/matter/widget/Director.ts","common/util/AnimateUtil.ts","pages/matter/widget/MatterDeleteModal.tsx","common/model/share/ShareType.ts","pages/matter/widget/MatterPanel.tsx","pages/matter/widget/MoveBatchModal.tsx","common/model/share/ShareExpireOption.ts","common/model/share/Share.ts","pages/matter/widget/ShareOperationModal.tsx","pages/share/widget/ShareDialogModal.tsx","pages/widget/BreadcrumbPanel.tsx","pages/matter/widget/MatterSortPanel.tsx","pages/matter/List.tsx","common/model/image/cache/ImageCache.ts","pages/matter/widget/imageCache/ImageCachePanel.tsx","pages/matter/widget/imageCache/ImageCacheList.tsx","pages/matter/Detail.tsx","pages/bin/List.tsx","pages/share/widget/ShareBar.tsx","pages/share/List.tsx","pages/widget/FrameLoading.tsx","pages/share/widget/ShareMatterPanel.tsx","pages/share/Detail.tsx","pages/layout/BottomLayout.tsx","common/menu/MenuItem.ts","common/menu/MenuManager.tsx","pages/layout/widget/AboutModal.tsx","pages/layout/SideLayout.tsx","pages/layout/TopLayout.tsx","pages/layout/ContentLayout.tsx","pages/Frame.tsx","App.tsx","index.tsx","assets/image/file/archive.svg","assets/image/avatar.png","assets/image/empty.svg","assets/image/error.png"],"names":["module","exports","TankComponent","mounted","this","setState","console","info","constructor","name","React","Component","SafeUtil","callback","noop","e","stopPropagation","domEvent","func","safeCallback","StringUtil","str","error","replace","letter","index","substr","toUpperCase","toLowerCase","father","child","indexOf","bytes","si","thresh","Math","abs","units","u","length","toFixed","c","result","exec","toString","obj","key","path","num","parts","split","filter","item","splice","join","prefix","suffix","substring","a","b","separator","text","undefined","trim","isBlank","Date","getTime","level","standardString","list","len","floor","push","code","forEach","exchangeString","strNew","map","i","pow","UPPER_CASES","SortDirection","Filter","visible","value","SortFilter","DESC","DESCEND","ASC","ASCEND","HttpUtil","url","params","successCallback","errorCallback","finallyCallback","axios","get","then","response","catch","finally","opts","post","formData","processCallback","config","headers","cancelToken","onUploadProgress","DateUtil","date","moment","format","DEFAULT_HOUR_MINUTE","DEFAULT_FORMAT","DATE_FORMAT","add","formatString","isValid","toDate","SLASH_DATE_FORMAT","TIME_FORMAT","COMPACT_DATE_FORMAT","JsonUtil","Array","JSON","parse","stringify","json","ObjectUtil","standardObj","extraObj","hasOwnProperty","checkKey","Object","deepExtend","field","str2Date","Clazz","String","parseList","beans","bean","clazz","assign","arr","encodeURIComponent","Base","autoId","generateAutoId","extend","assignList","EntityClazz","prototype","AUTO_INCREMENT_ID","target","WebResultCode","ViewBase","reactComponent","updateComponentUI","component","entity","_version","warn","Sun","frameComponent","reactRouter","showDrawer","isMobile","test","window","navigator","userAgent","singleton","getSingleton","route","keys","query","URLSearchParams","navigateTo","go","updateUI","WebResultCodes","k","WebResultCodeMap","OK","BAD_REQUEST","NEED_SHARE_CODE","SHARE_CODE_ERROR","LOGIN","NOT_INSTALLED","SERVER","UNKNOWN","WebResultCodeList","type","MessageBoxUtil","content","success","warning","HttpBase","needReactComponentUpdate","loading","errorMessage","msg","temp","getErrorMessage","data","lastLoginErrorTimestamp","jumpLogin","that","httpGet","specialErrorHandler","err","defaultErrorHandler","res","qs","httpPost","Color","BaseEntity","uuid","sort","createTime","updateTime","detailLoading","assignEntity","className","functionName","lowerCamel","lowerSlash","getTAG","getUrlPrefix","getUrlCreate","getUrlEdit","validate","getForm","getUrlDetail","getUrlDel","UserRole","BrowserUtil","nameEQ","ca","document","cookie","charAt","location","href","results","RegExp","decodeURIComponent","reg","r","search","match","unescape","storage","localStorage","setItem","removeItem","isLocalStorageNameSupported","protocol","host","lang","language","userLanguage","LangEn","eyeblueTank","dashboard","totalInvokeNum","weekRate","dayRate","yesterdayInvoke","totalUV","yesterdayUV","totalMatterNum","yesterdayMatterNum","totalFileSize","yesterdayMatterSize","recentDayInvokeUV","downloadMatterTop10","activeIpTop10","warnHint","reRun","install","configMysql","port","schema","username","password","charset","mysqlConnectionPass","testMysqlConnection","notice","mysqlNotice1","mysqlNotice2","validateMysqlFirst","preStep","nextStep","createTable","installed","installedButMissing","toBeInstalled","allFields","missingFields","tableNotice","tableNotice1","tableNotice2","tableNotice3","tableNotice4","oneKeyCreate","createFinish","createTableSuccess","crateTableFirst","setAdministrator","detectAdministrator","useOrCreateAdministrator","validateAdministrator","createAdministrator","administratorUsername","administratorPassword","administratorRePassword","usernameRule","congratulationInstall","configAdminFirst","createAdminSuccess","validateAdminSuccess","pressToHome","enterHome","finish","layout","allFiles","myShare","bin","setting","users","logout","about","dragMouseUp","matter","file","directory","rename","download","delete","hardDelete","recovery","more","share","close","size","preview","move","moveTo","upload","create","deleteTime","root","fillInPicLink","rePick","chooseImage","uploadMode","fillMode","sizeExceedLimit","setPublic","setPrivate","copyLink","enterName","publicFileEveryoneCanVisit","fileDetail","expire","copyLinkAndCode","uploaded","uploadDir","uploadInfo","uploadErrorInfo","exportCSV","speed","fileInfo","fileName","copyPath","publicOrPrivate","privateInfo","publicInfo","downloadTimes","operations","oneTimeLink","oneTimeLinkInfo","imageCache","searchFile","noContentYet","newDirectory","notChoose","exceed1000","noImageCache","recycleBin","deleted","unCompatibleBrowser","canIUse","intoRecycleBin","finishingTip","router","login","autoLogin","register","userDetail","changePassword","editUser","createUser","shareDetail","preference","basic","scan","websiteName","logo","logoSquare","onlyAllowIco","copyright","extraInfo","zipMaxNumLimit","zipMaxSizeLimit","current","noLimit","userDefaultSizeLimit","matterBinDefaultSaveDay","enterMatterBinDefaultSaveDay","docLink","tankDocLink","allowRegister","systemCleanup","systemCleanupDescription","systemCleanupPrompt","previewConfig","editPreference","editPreviewEngine","enterWebsiteName","enterZipMaxNumLimit","enterZipMaxSizeLimit","enterUserDefaultSizeLimit","engine","noEngine","newEngine","engineReg","engineSuffix","enginePreview","defaultPreview","previewEngine","defaultPreviewDesc","engineUsageHint","engineRegHelper","engineRegPlaceHolder","engineSuffixPlaceHolder","previewCurrent","previewOpen","editScan","enableScan","disabledScan","scanCron","cron","cronValidate","scanScope","scanUsers","scanPerTenSeconds","scanPerThirtySeconds","scanPerMinute","scanPerHour","scanCustom","chooseUsers","chooseUsersValidate","scanLoading","matterBinDefaultTip","shareTime","expireTime","noExpire","expired","shareSuccess","sharer","link","copyCode","copySuccess","cancelShare","getLink","noContent","enterCode","getFiles","codeError","cancelPrompt","hour","day","week","month","year","infinity","emptyHint","user","redirecting","oldPassword","newPassword","confirmNewPassword","cannotBeNull","passwordNotSame","role","singleFileSizeLimit","totalFileSizeLimit","status","lastLogin","lastLoginIp","lastLoginTime","resetPassword","transfiguration","enterPassword","enterUsername","enterNewPassword","profile","avatar","confirmPassword","disabled","disableUser","disable","active","sync","activeUser","deleteUser","deleteHint","welcomeLogin","logining","loginSuccess","toToRegister","welcomeRegister","registering","goToLogin","roleGuest","roleUser","roleAdministrator","statusActive","statusDisabled","webdavLink","editSomebodyPassword","transfigurationPromptText","transfigurationPrompt","allUsers","partialUsers","model","passwordRule","linkCodeText","copyLinkCodeSuccess","plugin","cannotPreview","emptyHintDefault","everyPage","items","total","clickRefresh","selectAll","edit","required","cancel","actionCanNotRevertConfirm","actionDeleteConfirm","actionRecoveryConfirm","prompt","confirm","copy","copyError","showMore","submit","save","operationSuccess","operation","notFound","yes","no","all","refresh","inputRequired","LangZh","deleteDirectly","Lang","browserLang","localLang","getItem","keyParts","jsonBody","part","param","UserStatus","UserRoles","UserRoleMap","GUEST","t","WARNING","USER","PRIMARY","ADMINISTRATOR","DANGER","UserRoleList","UserStatuss","UserStatusMap","SUCCESS","DISABLED","UserStatusList","NumberUtil","gcd","numerator","denominator","maxFactor","parseInt","numerator1","denominator1","numerator2","denominator2","fraction1","reduce","fraction2","MimeUtil","filename","dotIndex","lastIndexOf","extension","getExtension","MIMES","ImageUtil","origin","width","height","supportExtensions","fractionEqual","IMAGE_PLACEHOLDER_10_10","IMAGE_PLACEHOLDER_20_7","IMAGE_PLACEHOLDER_4_3","IMAGE_PLACEHOLDER_16_9","IMAGE_PLACEHOLDER_2_1","SelectionFilterType","InputFilter","placeholder","SelectionFilter","options","selectionType","COMBOBOX","j","User","avatarUrl","lastIp","lastTime","sizeLimit","totalSize","totalSizeLimit","handleImageUrl","defaultAvatarPath","finalCallback","form","URL_LOGIN","URL_REGISTER","loginRequired","URL_INFO","httpPureGet","URL_LOGOUT","URL_USER_CHANGE_PASSWORD","URL_USER_RESET_PASSWORD","URL_USER_TOGGLE_STATUS","authentication","URL_AUTHENTICATION_LOGIN","URL_USER_TRANSFIGURATION","URL_USER_SCAN","ScanScopeType","PreviewEngine","extensions","previewInSite","getExtensionWithoutDot","canHandle","defaultEngines","officeEngine","globalEngine","PreviewConfig","previewEngines","ScanCronType","ScanScopeTypes","ScanScopeTypeMap","ALL","CUSTOM","ScanScopeTypeList","ScanCronTypes","ScanCronTypeMap","TEN_SECONDS","THIRTY_SECONDS","MINUTE","HOUR","ScanCronTypeList","ScanCronTypeValueList","ScanConfig","enable","scope","usernames","cronType","Preference","logoUrl","faviconUrl","record","downloadDirMaxSize","downloadDirMaxNum","defaultTotalSizeLimit","deletedKeepDays","scanConfig","version","toJson","querySelector","createElement","rel","getElementsByTagName","appendChild","title","URL_API_PREFERENCE_FETCH","updateTitleAndFavicon","URL_API_SYSTEM_CLEANUP","URL_API_PREFERENCE_EDIT_PREVIEW_CONFIG","URL_API_PREFERENCE_EDIT_SCAN","URL_API_PREFERENCE_SCAN_ONCE","Moon","Login","props","state","httpLogout","updateFrame","values","httpLogin","history","errorInfo","xs","span","md","offset","initialValues","remember","onFinish","bind","onFinishFailed","Item","rules","message","UserOutlined","Password","LockOutlined","icon","block","htmlType","to","Register","httpRegister","dependencies","hasFeedback","getFieldValue","validator","rule","Promise","reject","resolve","Pager","pageSize","page","totalItems","totalPages","urlPage","filters","getUrlList","getFilters","queryPageNum","getQueryByName","queryPageSize","isInteger","queryValue","putValue","reset","setFilterValue","getFilter","getValueString","isEmpty","getParams","replaceState","pathname","showTotal","totalNum","showSizeChanger","columnKey","filterKey","capitalize","sortFilter","antdSortValue","getAntdValue","pagination","sorter","extra","resetSortFilters","isEmptyObject","underScoreToCamel","order","httpList","MAX_PAGE_SIZE","FileUtil","mimeType","getMimeType","startWith","idDir","require","isPdf","isDoc","isPpt","isXls","isAudio","isVideo","isText","isPsd","isImage","endWith","logs","Blob","URL","createObjectURL","csvStr","CSV","header","encode","blob","InputFilterBox","event","inputFilter","onChange","onValueChange","DateTimeFilter","DateTimeFilterBox","momentTime","dateString","dateTimeFilter","showTime","CheckFilter","Option","CheckFilterBox","checkFilter","backValue","style","minWidth","SelectionFilterBox","selectionFilter","Group","Button","SortFilterBox","HttpSelectionFilter","HttpSelectionFilterBox","httpSelectionFilter","strictPutValue","selectionOptions","DateFilterBox","dateFilter","DateFilter","FilterPanel","onReset","onSearch","needSearchButton","needResetButton","selectionButtonLoose","val","onChildChange","onClick","TableEmpty","pager","emptyContent","image","EmptyImage","description","onRefresh","errorContent","ErrorImage","TankTitle","children","ClipboardUtil","textAreaElement","cssText","body","select","execCommand","TransfigurationModal","httpTransfiguration","textToCopy","fullHost","onClose","modal","okCancel","okButtonProps","destroy","List","enableHistory","getCurrentSortFilter","httpToggleStatus","twoToneColor","onOk","httpDel","open","columns","dataIndex","render","prePath","alt","src","getAvatarUrl","color","humanFileSize","simpleDateTime","sortOrder","getDefaultSortOrder","sortDirections","StopOutlined","toggleStatus","CheckCircleOutlined","UserSwitchOutlined","PlusOutlined","rowKey","dataSource","getPagination","tableOnChange","locale","emptyText","InfoCell","firstSpan","secondSpan","Expanding","VelocityTransitionGroup","enter","animation","leave","MobileUserPanel","clickRow","toggleHandles","isCurrentUser","EllipsisOutlined","stopPropagationWrap","EditOutlined","onToggleStatus","DeleteOutlined","onDelete","onTransfiguration","MobileList","ExclamationCircleFilled","resetFilter","changeSearch","currentTarget","changePage","currentUser","Search","enterButton","hideOnSinglePage","TankContentCard","ImagePreviewer","div","setAttribute","innerHTML","showMultiPhoto","urls","w","h","fullscreenEl","shareEl","tapToToggleControls","pswpDom","photoSwipe","PhotoSwipe","PhotoSwipeUIDefault","listen","img","Image","onload","updateSize","init","parentNode","removeChild","SingleTextModal","innerValue","onSuccess","onSubmitClick","initialValue","ChangePasswordModal","httpChangePassword","tailLayout","wrapperCol","labelCol","label","Detail","syncLoading","httpDetail","httpResetPassword","httpScan","handles","UnlockOutlined","danger","syncPhysics","showSinglePhoto","EnvUtil","BrowserPreviewer","CloseOutlined","element","ReactDOM","DownloadToken","userUuid","matterUuid","ip","URL_FETCH_DOWNLOAD_TOKEN","PreviewerHelper","needTokenUrl","downloadToken","httpFetchDownloadToken","matterUrl","getPreviewUrl","previewUrl","canPreview","defaultPreviewEngines","targetUrl","show","needToken","privacy","prepareMatterUrl","Matter","puuid","dir","alien","md5","times","visitTime","parent","check","editMode","uploadHint","progress","cancelSource","CancelToken","source","uuidsString","currentHost","URL_MATTER_ZIP","getIcon","downloadUrl","getDownloadUrl","shareMode","URL_MATTER_CREATE_DIRECTORY","URL_MATTER_SOFT_DELETE","uuids","URL_MATTER_SOFT_DELETE_BATCH","URL_MATTER_DELETE","URL_MATTER_DELETE_BATCH","URL_MATTER_RECOVERY","URL_MATTER_RECOVERY_BATCH","URL_MATTER_RENAME","URL_CHANGE_PRIVACY","srcUuids","destUuid","URL_MATTER_MOVE","simpleType","containStr","failureCallback","validateFilter","validateFileType","FormData","append","lastTimeStamp","lastSize","httpPostFile","URL_MATTER_UPLOAD","isCancel","clear","loaded","currentTime","deltaTime","currentSize","deltaSize","token","downloadTokenUuid","shareUuid","shareCode","shareRootUuid","URL_MATTER_DOWNLOAD","MATTER_ROOT","UploadMatterPanel","percent","nextProps","nextContext","cancelUpload","strokeColor","from","MatterImage","manual","changeLink","triggerUpload","fileObj","httpUpload","toggleHandle","previewWidth","customRequest","showUploadList","Edit","formRef","createRef","createMode","httpSave","navigateBack","editSelf","roleEditable","ref","onValuesChange","noStyle","min","Authentication","httpAuthenticationLogin","PreviewEngineCell","Index","httpFetch","httpSystemCleanup","hide","httpScanOnce","cleanup","ThunderboltOutlined","dangerouslySetInnerHTML","__html","Children","toArray","ScanOutlined","immediateScan","refreshPreference","max","valuePropName","SaveOutlined","PreviewEngineEditCell","QuestionCircleOutlined","checked","PreviewConfigPanel","addEngine","delEngineCell","PreviewEngineEdit","httpSavePreviewEngine","ScanEdit","httpSaveScan","changeEnableScan","changeCronType","changeScopeType","fetchUser","includes","option","mode","labelInValue","notFoundContent","filterOption","RatePanel","standardValue","compareValue","v2","noData","infinite","getValue","fontSize","Dashboard","invokeNum","uv","totalUv","matterNum","fileSize","avgCost","dt","URL_ACTIVE_IP_TOP10","URL_ETL","Echarts","registerTheme","theme","yesterdayDashboard","matterPager","days","dateStrings","standardWeekInvokeNum","compareWeekInvokeNum","standardDayInvokeNum","compareDayInvokeNum","standardWeekUv","compareWeekUv","standardDayUv","compareDayUv","standardWeekMatterNum","compareWeekMatterNum","standardDayMatterNum","compareDayMatterNum","standardWeekSize","compareWeekSize","standardDaySize","compareDaySize","invokeListOption","tooltip","legend","xAxis","yAxis","series","updateDateStrings","refreshDashboardPager","refreshMatterPager","refreshActiveIpTop10","d","thenDate","simpleDate","invokeNumData","uvData","matterNumData","fileSizeData","httpActiveIpTop10","httpEtl","gutter","sm","lg","notMerge","lazyUpdate","onChartReady","showLoading","renderer","Install","mysqlPort","mysqlHost","mysqlSchema","mysqlUsername","mysqlPassword","mysqlCharset","adminUsername","adminPassword","adminRepassword","tableInfoList","adminList","verified","adminConfigured","tableInfo","tableExist","URL_VERIFY","getMysqlForm","URL_TABLE_INFO_LIST","URL_CREATE_TABLE","tableCreated","URL_ADMIN_LIST","renderList","URL_CREATE_ADMIN","URL_VALIDATE_ADMIN","URL_FINISH","Phase","MysqlPanel","httpVerify","onNextStep","ghost","goToNext","CreateTablePanel","createTableLoading","fetchTableInfoList","httpTableInfoList","httpCreateTable","onPreStep","spinning","DBName","goToPrevious","PhaseSelectingPanel","loadingAdminList","refreshAdminList","httpAdminList","admin","onSelectVerify","onSelectCreate","PhaseVerifyPanel","httpValidateAdmin","PhaseCreatePanel","httpCreateAdmin","SetAdminPanel","phase","SELECTING","CREATE","VERIFY","FinishPanel","httpFinish","subTitle","TabPane","activeName","activeKey","onTabClick","tab","Director","renameMode","moveMode","AnimateUtil","startValue","endValue","duration","processHandler","startHandler","endHandler","standard","totalStep","ceil","delta","sum","intervalHandler","setInterval","clearInterval","input","startPos","endPos","focus","selectionStart","selectionEnd","selection","createRange","range","collapse","moveEnd","moveStart","MatterDeleteModal","onHardDel","getRecycleBinStatus","onSoftDel","ShareType","MatterPanel","renameMatterName","renamingLoading","inputRef","prepareRename","director","isEditing","setTimeout","setInputSelection","clipboard","deleteMatter","httpSoftDelete","onDeleteSuccess","httpDelete","hardDeleteMatter","recoveryMatter","httpRecovery","onRecoverySuccess","changeMatterName","finishRename","httpRename","finishCreateDirectory","onCreateDirectoryCallback","httpCreateDirectory","blurTrigger","enterTrigger","blur","changePrivacy","httpChangePrivacy","checkToggle","onCheckMatter","highLight","recycleMode","onGoToDirectory","onPreviewImage","renderPcOperation","RedoOutlined","InfoCircleOutlined","CloseCircleOutlined","LinkOutlined","DownloadOutlined","simpleDateHourMinute","renderMobileOperation","onBlur","onKeyUp","MoveBatchModal","targetUuid","treeData","fetchData","treeNode","concat","onLoadData","onSelect","selectedKeys","DirectoryTree","defaultExpandedKeys","loadData","expanded","FolderOpenFilled","FolderFilled","ShareExpireOption","ShareTypes","ShareTypeMap","FILE","DIRECTORY","MIX","ShareTypeList","ShareExpireOptions","ShareExpireOptionMap","deltaMillisecond","DAY","WEEK","MONTH","YEAR","INFINITY","ShareExpireOptionList","Share","shareType","expireInfinity","dirMatter","matters","rootUuid","expireOption","now","URL_ZIP","matterUuids","getExpireTime","URL_CREATE","URL_DELETE_BATCH","URL_BROWSE","errorMsg","ShareOperationModal","selectChange","confirmCallback","ShareDialogModal","copyAll","CopyOutlined","maskClosable","BreadcrumbPanel","breadcrumbModels","displayDirect","navigateQueryTo","MatterSortPanel","changeFilterOrder","orderName","getFilterValue","nextSortIndex","sortAutomaton","findIndex","ArrowUpOutlined","ArrowDownOutlined","newMatter","selectedMatters","searchText","newMatterRef","dragEnterCount","tempUploadList","uploadErrorLogs","drag","dragEnterListener","preventDefault","dragleaveListener","dragoverListener","dropListener","launchUpload","dataTransfer","files","el","getElementById","addEventListener","remove","removeEventListener","refreshPager","refreshBreadcrumbs","checkMatter","checkAll","checkNone","deleteBatch","httpSoftDeleteBatch","httpDeleteBatch","downloadZip","toggleMoveBatch","httpMove","debounce","wait","timer","clearTimeout","triggerUploadDir","uploadDirectory","getErrorLogsToCSVUrl","okText","dirPathUuidMap","paths","webkitRelativePath","pPaths","slice","pPathStr","midPaths","midPathStr","m","f","errHandle","FileList","uploadMatters","instance","shareBatch","httpCreate","createDirectory","previewImage","imageArray","startIndex","goToDirectory","id","cur","reduceRight","CloudUploadOutlined","PlusSquareOutlined","MinusSquareOutlined","DragOutlined","ShareAltOutlined","multiple","FolderOutlined","SyncOutlined","ImageCache","matterName","ImageCachePanel","onCheckImageCache","deleteImageCache","onPreviewImageCache","getOriginUrl","SmallDashOutlined","ImageCacheList","selectedImageCaches","checkBatch","checkImageCache","initFilter","previewImageCache","getResizeUrl","tip","recoverBatch","httpRecoveryBatch","ShareBar","showShare","delShare","hasExpired","FrameLoading","LoadingOutlined","ShareMatterPanel","getSharePreviewUrl","getShareDownloadUrl","needShareCode","sharePagerSize","httpBrowse","setFilterValues","orderCreateTime","orderDir","paramId","pMatter","BottomLayout","changeLang","DefaultLogoPng","MenuItem","MenuManager","getMenuItems","menuItem","menuItems","AppstoreOutlined","SettingOutlined","DashboardOutlined","TeamOutlined","PoweroffOutlined","AboutModal","SideLayout","selectMenu","menuManager","getSelectedKeys","TopLayout","goHome","toggleDrawer","ContentLayout","RawFrame","initialized","initialize","startsWith","httpInfo","errMessage","exact","UserLogin","UserRegister","UserDetail","UserList","MobileUserList","UserEdit","UserAuthentication","DashboardIndex","PreferenceIndex","PreferenceEdit","PreferenceEngineEdit","PreferenceScanEdit","MatterDetail","MatterList","ShareList","ShareDetail","BinList","InstallIndex","Frame","withRouter","App","en_US"],"mappings":"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","file":"static/js/main.692308e3.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/folder.f8d1b500.svg\";","module.exports = __webpack_public_path__ + \"static/media/pdf.c256fdcb.svg\";","module.exports = __webpack_public_path__ + \"static/media/doc.1e70a87c.svg\";","module.exports = __webpack_public_path__ + \"static/media/ppt.9ec3e018.svg\";","module.exports = __webpack_public_path__ + \"static/media/xls.ef5ba31b.svg\";","module.exports = __webpack_public_path__ + \"static/media/audio.30a1ea02.svg\";","module.exports = __webpack_public_path__ + \"static/media/video.4387235d.svg\";","module.exports = __webpack_public_path__ + \"static/media/text.49dc13ae.svg\";","module.exports = __webpack_public_path__ + \"static/media/psd.be6691be.svg\";","module.exports = __webpack_public_path__ + \"static/media/image.06f036ce.svg\";","module.exports = __webpack_public_path__ + \"static/media/file.fd3e15f8.svg\";","module.exports = __webpack_public_path__ + \"static/media/logo.21458adb.png\";","import React from 'react';\r\n\r\n\r\n/**\r\n * 带有挂载状态的自定义组件\r\n */\r\nexport default class TankComponent extends React.Component {\r\n\r\n //是否处于挂载的状态。\r\n mounted: boolean = false\r\n\r\n componentWillUnmount() {\r\n let that = this\r\n that.mounted = false\r\n }\r\n\r\n componentWillMount() {\r\n let that = this\r\n that.mounted = true\r\n }\r\n\r\n //更新当前视图。\r\n updateUI() {\r\n let that = this\r\n if (that.mounted) {\r\n that.setState({})\r\n } else {\r\n console.info(this.constructor.name + \"已经脱离挂载,不再刷新视图。\")\r\n }\r\n }\r\n\r\n //获取当前组件的唯一标识\r\n getIdentifier() {\r\n return this.constructor.name;\r\n }\r\n}\r\n\r\n","export default class SafeUtil {\r\n\r\n //安全的调用某个函数,函数不存在,创建一个空函数。\r\n static safeCallback(callback: any) {\r\n if (typeof callback === \"function\") {\r\n return callback\r\n } else {\r\n return SafeUtil.noop\r\n }\r\n }\r\n\r\n\r\n //空函数\r\n static noop = () => {\r\n };\r\n\r\n\r\n //停止事件冒泡\r\n static stopPropagation(e: any) {\r\n if (!e) {\r\n return\r\n }\r\n\r\n if (e.stopPropagation) {\r\n //系统的点击事件\r\n e.stopPropagation()\r\n } else if (e.domEvent && e.domEvent.stopPropagation) {\r\n //antd的事件\r\n e.domEvent.stopPropagation()\r\n\r\n }\r\n }\r\n\r\n // 停止事件冒泡包装函数\r\n static stopPropagationWrap(e: any) {\r\n SafeUtil.stopPropagation(e);\r\n return (func?: any) => {\r\n SafeUtil.safeCallback(func);\r\n }\r\n }\r\n\r\n}\r\n","export default class StringUtil {\n\n //大写字母\n static UPPER_CASES = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n //下划线转驼峰\n static underScoreToCamel(str: string) {\n\n if (!str) {\n console.error('不能转换空的驼峰字符串。')\n return str\n }\n\n const regex = /_[a-z]/gm;\n\n return str.replace(regex, function (letter: any, index: any) {\n return letter.substr(1).toUpperCase()\n })\n }\n\n //转换成首字母小写的驼峰法\n static lowerCamel(str: any) {\n\n if (!str) {\n console.error('不能转换空的驼峰字符串。')\n return str\n }\n\n return str.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (letter: any, index: any) {\n return index === 0 ? letter.toLowerCase() : letter.toUpperCase()\n }).replace(/\\s+/g, '')\n }\n\n\n //转换成全部小写的使用 /分隔的字符串\n static lowerSlash(str: any) {\n return str.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (letter: any, index: any) {\n return '/' + letter.toLowerCase()\n }).replace(/\\s+/g, '')\n }\n\n //一个字符串包含子字符串\n static containStr(father: string | null, child: string): boolean {\n\n if (father === null || father === '') {\n return false\n }\n return father.indexOf(child) !== -1\n }\n\n //把一个大小转变成方便读的格式\n //human readable file size\n static humanFileSize(bytes: number, si:boolean = false) {\n let thresh = si ? 1000 : 1024\n if (Math.abs(bytes) < thresh) {\n return bytes + ' B'\n }\n let units = si\n ? ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\n : ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n let u = -1\n do {\n bytes /= thresh\n ++u\n } while (Math.abs(bytes) >= thresh && u < units.length - 1)\n return bytes.toFixed(1) + ' ' + units[u]\n }\n\n //将首字母大写\n static capitalize(str: any) {\n\n if (!str) {\n return str;\n }\n\n str = str.replace(/^\\w/, (c: any) => c.toUpperCase());\n\n return str\n }\n\n //将首字母小写\n static lower(str: any) {\n\n if (!str) {\n return str;\n }\n\n str = str.replace(/^\\w/, (c: any) => c.toLowerCase());\n\n return str\n }\n\n //获取一个function的名字\n static functionName(func: any) {\n // Match:\n // - ^ the beginning of the string\n // - function the word 'function'\n // - \\s+ at least some white space\n // - ([\\w\\$]+) capture one or more valid JavaScript identifier characters\n // - \\s* optionally followed by white space (in theory there won't be any here,\n // so if performance is an issue this can be omitted[1]\n // - \\( followed by an opening brace\n //\n let result = /^function\\s+([\\w\\$]+)\\s*\\(/.exec(func.toString())\n\n return result ? result[1] : '' // for an anonymous function there won't be a match\n }\n\n //check whether an obj is empty\n static isEmptyObject(obj: any) {\n\n if (!obj) {\n return true;\n }\n\n for (let key in obj) {\n return false;\n }\n return true\n }\n\n\n /**\n * 获取到上num级路径\n * 例子: /tank/setting/notification -> /tank/setting\n * @param path 原路径\n * @param num 上几级,默认1级\n */\n static prePath(path: string, num: number = 1): string {\n if (!path) {\n return path\n }\n\n //去除掉最后的/符号。\n let parts: string[] = path.split(\"/\");\n //去除所有的空\n parts = parts.filter((item: string, index: number) => {\n return item !== \"\"\n })\n\n //前面几层就是删掉前面几个元素。如果超出了,会全部删掉。\n parts.splice(parts.length - num)\n\n return \"/\" + parts.join(\"/\")\n }\n\n\n static startWith(str: any, prefix: any) {\n if (typeof prefix === 'undefined' || prefix === null || prefix === '' || typeof str === 'undefined' || str === null || str.length === 0 || prefix.length > str.length) {\n return false\n }\n\n return str.substr(0, prefix.length) === prefix\n }\n\n static endWith(str: any, suffix: any) {\n if (suffix === null || suffix === '' || str === null || str.length === 0 || suffix.length > str.length) {\n return false\n }\n\n return str.substring(str.length - suffix.length) === suffix\n }\n\n\n /**\n * 去除掉开头的前缀\n * @param str 待处理的字符串\n * @param prefix 前缀\n */\n static trimPrefix(str: string | null, prefix: string): string {\n\n if (!str) {\n return \"\"\n } else {\n if (str.substr(0, prefix.length) === prefix) {\n return str.substr(prefix.length)\n } else {\n return str\n }\n }\n\n }\n\n /**\n * 去除掉后缀\n * @param str 待处理的字符串\n * @param suffix 前缀\n */\n static trimSuffix(str: string | null, suffix: string): string {\n\n if (!str) {\n return \"\"\n } else {\n if (str.substring(str.length - suffix.length) === suffix) {\n return str.substr(0, str.length - suffix.length)\n } else {\n return str\n }\n }\n\n }\n\n\n //在字符串a后面追加字符串b\n static append(a: any, b: any, separator = \"\") {\n\n if (a === null || a === \"\" || typeof a !== \"string\") {\n return b;\n } else {\n return a + separator + b;\n }\n }\n\n\n static isBlank(text: string | null | undefined): boolean {\n\n if (text === null || text == undefined) {\n return true\n }\n\n return text.trim() === \"\";\n\n }\n\n static isNotBlank(text: string | null | undefined): boolean {\n\n return !StringUtil.isBlank(text)\n\n }\n\n\n //将时间戳转换成62进制\n static generateUniqueCode(num?: number): string {\n //获取时间戳\n\n if (num === undefined) {\n num = new Date().getTime()\n }\n\n let standardString = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n let result;\n let list: number[] = [];\n let len = standardString.length;\n let level;\n for (level = 0; Math.floor(num / len) > 0; level++) {\n result = num % len;\n list.push(result)\n num = (num - result) / len\n }\n list.push(num);\n let code = '';\n list.forEach((item) => {\n code = standardString[item] + code;\n })\n return code\n }\n\n //字符串转换成十进制\n static parseUniqueCode(str: string): number {\n\n let exchangeString = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n let strNew = str.split(\"\");\n let list: number[] = [];\n strNew.map((item: string) => {\n list.push(exchangeString.indexOf(item));\n });\n let num = 0;\n for (let i = 0; i < list.length; i++) {\n num += list[i] * Math.pow(exchangeString.length, list.length - i - 1);\n }\n return num;\n }\n\n\n}\n","enum SortDirection {\r\n //这两个是后台通用的标准\r\n ASC = 'ASC',\r\n DESC = 'DESC',\r\n\r\n //这两项是antd的标准\r\n DESCEND = 'descend',\r\n ASCEND = 'ascend'\r\n}\r\n\r\n\r\nexport default SortDirection\r\n","/**\r\n * 这个是列表筛选器的基类。\r\n */\r\nexport default class Filter {\r\n\r\n //中文名\r\n name: string\r\n //提交时候的键值,英文\r\n key: string\r\n //是否可见\r\n visible: boolean = true\r\n\r\n constructor(name: string, key: string, visible?: boolean) {\r\n this.name = name\r\n this.key = key\r\n\r\n //没有传默认为true.\r\n if (visible === undefined) {\r\n this.visible = true\r\n } else {\r\n this.visible = visible\r\n }\r\n }\r\n\r\n /**\r\n * 获取到一个字符串的值\r\n */\r\n getValueString(): string {\r\n console.error(`${this.constructor.name} 的 getValue 不存在,请开发者及时配置。`)\r\n return \"\"\r\n }\r\n\r\n /**\r\n * 把一个字符串放置到value中去,因为有可能从请求参数中回填值\r\n */\r\n putValue(value: string) {\r\n console.error(`${this.constructor.name} 的 putValue 不存在,请开发者及时配置。`)\r\n }\r\n\r\n /**\r\n * 将过滤器的值清空\r\n */\r\n reset() {\r\n console.error(`${this.constructor.name} 的 reset 不存在,请开发者及时配置。`)\r\n }\r\n\r\n /**\r\n * 当前过滤器是否为空\r\n */\r\n isEmpty():boolean {\r\n console.error(`${this.constructor.name} 的 isEmpty 不存在,请开发者及时配置。`)\r\n return false\r\n }\r\n\r\n}\r\n","import Filter from \"./Filter\";\r\nimport SortDirection from \"../SortDirection\";\r\n\r\n\r\n/**\r\n *\r\n * 排序过滤器\r\n *\r\n */\r\nexport default class SortFilter extends Filter {\r\n\r\n //值,最终填写的内容。null表示这个值不设置\r\n value: SortDirection | null = null\r\n\r\n constructor(name: string, code: string, visible?: boolean) {\r\n super(name, code, visible)\r\n //过滤排序器,more是不显示的。\r\n //没有传默认为true.\r\n if (visible === undefined) {\r\n this.visible = false\r\n } else {\r\n this.visible = visible\r\n }\r\n }\r\n\r\n //获取值字符串,[null,true,false] => [\"\",\"true\",\"false\"]\r\n getValueString(): string {\r\n if (this.value) {\r\n return this.value\r\n } else {\r\n return \"\"\r\n }\r\n }\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: string) {\r\n if (value === SortDirection.DESC || value === SortDirection.DESCEND) {\r\n this.value = SortDirection.DESC\r\n } else if (value === SortDirection.ASC || value === SortDirection.ASCEND) {\r\n this.value = SortDirection.ASC\r\n } else {\r\n this.value = null\r\n }\r\n }\r\n\r\n\r\n //获取到antd需要使用的值 TODO: SortOrder\r\n getAntdValue(): any | null {\r\n if (this.value === SortDirection.DESC || this.value === SortDirection.DESCEND) {\r\n return SortDirection.DESCEND\r\n } else if (this.value === SortDirection.ASC || this.value === SortDirection.ASCEND) {\r\n return SortDirection.ASCEND\r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n\r\n reset() {\r\n this.value = null\r\n }\r\n\r\n\r\n isEmpty(): boolean {\r\n return this.value === null;\r\n }\r\n\r\n\r\n}\r\n","import axios, { AxiosRequestConfig } from \"axios\";\r\nimport SafeUtil from \"./SafeUtil\";\r\n\r\n//http请求全部收口在这个工具类中,可以快速切换http框架。\r\nexport default class HttpUtil {\r\n static httpGet(\r\n url: any,\r\n params = {},\r\n successCallback?: any,\r\n errorCallback?: any,\r\n finallyCallback?: any,\r\n opts?: any\r\n ) {\r\n axios\r\n .get(url, {\r\n params: params,\r\n })\r\n .then(function (response) {\r\n SafeUtil.safeCallback(successCallback)(response);\r\n })\r\n .catch(function (error) {\r\n SafeUtil.safeCallback(errorCallback)(error);\r\n })\r\n .finally(function () {\r\n SafeUtil.safeCallback(finallyCallback)();\r\n });\r\n }\r\n\r\n static httpPost(\r\n url: any,\r\n params = {},\r\n successCallback?: any,\r\n errorCallback?: any,\r\n finallyCallback?: any,\r\n opts?: any\r\n ) {\r\n return axios\r\n .post(url, params, opts)\r\n .then(function (response) {\r\n SafeUtil.safeCallback(successCallback)(response);\r\n })\r\n .catch(function (error) {\r\n SafeUtil.safeCallback(errorCallback)(error);\r\n })\r\n .finally(function () {\r\n SafeUtil.safeCallback(finallyCallback)();\r\n });\r\n }\r\n\r\n /**\r\n * 上传文件的请求\r\n */\r\n static httpPostFile(\r\n url: string,\r\n formData: FormData,\r\n successCallback?: any,\r\n errorCallback?: any,\r\n finallyCallback?: any,\r\n processCallback?: (progressEvent: any) => void,\r\n opts?: any\r\n ) {\r\n const config: AxiosRequestConfig = {\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n cancelToken: opts ? opts.cancelToken : \"\",\r\n onUploadProgress: processCallback,\r\n };\r\n\r\n axios\r\n .post(url, formData, config)\r\n .then(function (response) {\r\n SafeUtil.safeCallback(successCallback)(response);\r\n })\r\n .catch(function (error) {\r\n SafeUtil.safeCallback(errorCallback)(error);\r\n })\r\n .finally(function () {\r\n SafeUtil.safeCallback(finallyCallback)();\r\n });\r\n }\r\n}\r\n","import moment from \"moment\"\r\n\r\nexport default class DateUtil {\r\n\r\n static DEFAULT_FORMAT = \"YYYY-MM-DD HH:mm:ss\";\r\n static DEFAULT_HOUR_MINUTE = \"YYYY-MM-DD HH:mm\";\r\n static SLASH_DATE_FORMAT = \"YYYY/MM/DD\";\r\n static TIME_FORMAT = \"HH:mm:ss\";\r\n static DATE_FORMAT = \"YYYY-MM-DD\";\r\n //紧凑型的时间格式\r\n static COMPACT_DATE_FORMAT = \"YYYYMMDD\";\r\n\r\n static simpleDateHourMinute(date: Date |null): string {\r\n if (date == null) {\r\n return \"\"\r\n } else {\r\n return moment(date).format(DateUtil.DEFAULT_HOUR_MINUTE)\r\n }\r\n }\r\n static simpleDateTime(date: Date | null): string {\r\n if (date == null) {\r\n return \"\"\r\n } else {\r\n return moment(date).format(DateUtil.DEFAULT_FORMAT)\r\n }\r\n }\r\n\r\n static simpleDate(date: Date | null): string {\r\n\r\n if (date == null) {\r\n return \"\"\r\n } else {\r\n return moment(date).format(DateUtil.DATE_FORMAT)\r\n }\r\n }\r\n\r\n /**\r\n * 某个日期的前一天\r\n */\r\n static lastDay(date: Date | null, format?: string): string {\r\n\r\n if (format === undefined) {\r\n format = DateUtil.DEFAULT_FORMAT\r\n }\r\n\r\n if (date == null) {\r\n return \"\"\r\n } else {\r\n return moment(date).add(-1, 'days').format(format)\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 按照指定格式进行格式化\r\n */\r\n static format(date: Date | null, formatString: string): string {\r\n if (date == null) {\r\n return \"\"\r\n } else {\r\n return moment(date).format(formatString)\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 将字符串,按照指定的格式反序列化成为时间对象\r\n * @param str\r\n */\r\n static parse(str: string): Date | null {\r\n\r\n let valid = moment(str).isValid();\r\n if (valid) {\r\n return moment(str).toDate()\r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n\r\n //将时间字符串转化成js date\r\n //deprecated,使用 parse方法替代。\r\n static str2Date(str: any): Date {\r\n\r\n let valid = moment(str).isValid();\r\n if (valid) {\r\n return moment(str).toDate()\r\n } else {\r\n //console.warn(\"不能转换成时间对象:\", str)\r\n return new Date()\r\n }\r\n }\r\n\r\n}\r\n","export default class JsonUtil {\r\n\r\n\r\n //将一个json字符串转换成 json 数组\r\n static parseList(str: any) {\r\n if (!str) {\r\n return []\r\n }\r\n if (str instanceof Array) {\r\n return str;\r\n }\r\n try {\r\n let list = JSON.parse(str);\r\n if (list instanceof Array) {\r\n return list;\r\n } else {\r\n console.error(\"不能将\" + str + \"转换成数组\");\r\n return [];\r\n }\r\n } catch (e) {\r\n console.error(\"不能将\" + str + \"转换成JSON\");\r\n return [];\r\n }\r\n }\r\n\r\n\r\n //将一个字符串转成js对象\r\n static toObj(str: any) {\r\n\r\n if (!str) {\r\n return {}\r\n }\r\n\r\n try {\r\n return JSON.parse(str)\r\n } catch (e) {\r\n console.error(\"不能将json字符串\" + str + \"转换成对象\");\r\n return {};\r\n }\r\n }\r\n\r\n //将一个对象转成json字符串\r\n static toJson(obj: any): string {\r\n\r\n if (!obj) {\r\n obj = {}\r\n }\r\n\r\n return JSON.stringify(obj)\r\n }\r\n\r\n //将JSON进行格式化。\r\n static prettyJson(json: any) {\r\n\r\n if (typeof json === 'string') {\r\n json = JSON.parse(json);\r\n }\r\n\r\n return JSON.stringify(json, null, 2)\r\n };\r\n\r\n}\r\n","import DateUtil from \"./DateUtil\";\r\nimport JsonUtil from \"./JsonUtil\";\r\n\r\nexport default class ObjectUtil {\r\n //将 extraObj 中的属性全部赋值给standardObj\r\n static extend(standardObj: any, extraObj: any) {\r\n for (let key in extraObj) {\r\n if (extraObj.hasOwnProperty(key)) {\r\n if (standardObj.hasOwnProperty(key)) {\r\n standardObj[key] = extraObj[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 深拷贝,保留standardObj第一层全部属性\r\n static deepExtend(standardObj: any, extraObj: any, checkKey: boolean = true) {\r\n for (let key in extraObj) {\r\n if (checkKey) {\r\n if (standardObj.hasOwnProperty(key)) {\r\n standardObj[key] =\r\n extraObj[key] instanceof Object\r\n ? ObjectUtil.deepExtend({}, extraObj[key], false)\r\n : extraObj[key];\r\n }\r\n } else {\r\n standardObj[key] =\r\n extraObj[key] instanceof Object\r\n ? ObjectUtil.deepExtend({}, extraObj[key], false)\r\n : extraObj[key];\r\n }\r\n }\r\n return standardObj;\r\n }\r\n\r\n //将standardObj的field属性规整成时间格式。\r\n static assignDate(standardObj: any, field: any) {\r\n if (standardObj.hasOwnProperty(field)) {\r\n standardObj[field] = DateUtil.str2Date(standardObj[field]);\r\n }\r\n }\r\n\r\n //吧standardObj的field属性归整成Clazz类型\r\n static assignList(standardObj: any, field: any, Clazz: any) {\r\n if (standardObj.hasOwnProperty(field)) {\r\n //如果我们要转换成字符串的数组形式,那么this[field]应该是一个字符串才对。\r\n if (Clazz === String) {\r\n standardObj[field] = JsonUtil.parseList(standardObj[field]);\r\n\r\n return;\r\n }\r\n\r\n //下面就是转换实体数组了。\r\n let beans = standardObj[field];\r\n if (!beans) {\r\n //服务器返回这个字段为空 维持构造函数中的默认值(一般而言是一个[])\r\n standardObj[field] = new standardObj.constructor()[field];\r\n return;\r\n }\r\n\r\n standardObj[field] = [];\r\n\r\n if (!Clazz) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < beans.length; i++) {\r\n let bean = beans[i];\r\n let clazz = new Clazz();\r\n\r\n if (clazz.assign) {\r\n clazz.assign(bean);\r\n } else {\r\n console.error(clazz);\r\n console.error(\"没有定义assign方法\");\r\n }\r\n\r\n standardObj[field].push(clazz);\r\n }\r\n }\r\n }\r\n\r\n //check whether an obj is empty\r\n static isEmptyObject(obj: object) {\r\n if (typeof obj !== \"object\") {\r\n console.error(\"判定的不是obj对象\");\r\n return true;\r\n }\r\n\r\n for (let key in obj) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 将键值对转换成 age=18&name=xxx 的形式\r\n */\r\n static param(map: any) {\r\n let arr: string[] = [];\r\n for (let key in map) {\r\n if (map.hasOwnProperty(key)) {\r\n let value = map[key];\r\n arr[arr.length] =\r\n encodeURIComponent(key) +\r\n \"=\" +\r\n encodeURIComponent(value == null ? \"\" : value);\r\n }\r\n }\r\n\r\n return arr.join(\"&\");\r\n }\r\n}\r\n","import ObjectUtil from \"../../util/ObjectUtil\";\r\nimport JsonUtil from \"../../util/JsonUtil\";\r\nimport DateUtil from \"../../util/DateUtil\";\r\n\r\n/**\r\n *\r\n * 基类。使我们前端的所有自定义类的基类。\r\n * 在这个类中可以统计建立的实体个数。\r\n */\r\nexport default class Base {\r\n\r\n //id自增长值\r\n private static AUTO_INCREMENT_ID = 0\r\n\r\n //当前对象的ID,这个字段让我们可以很轻松的统计出共创建了多少个实体类。\r\n autoId: number = 0\r\n\r\n\r\n //我们认为每个实体都会存放于某个react组件中,当然可以不传入。\r\n constructor() {\r\n\r\n this.autoId = Base.generateAutoId()\r\n }\r\n\r\n static generateAutoId() {\r\n Base.AUTO_INCREMENT_ID++\r\n return Base.AUTO_INCREMENT_ID\r\n }\r\n\r\n\r\n //把obj中的属性,赋值到this中来。采用深拷贝。\r\n assign(obj: any) {\r\n ObjectUtil.extend(this, obj)\r\n }\r\n\r\n /**\r\n *\r\n * @param field 字段名\r\n * @param Clazz 类型名\r\n */\r\n assignList(field: string, Clazz: any) {\r\n\r\n ObjectUtil.assignList(this, field, Clazz)\r\n }\r\n\r\n\r\n /**\r\n * 根据一个类型,渲染出对应的数组。\r\n * @param json 字符串或者数组对象。\r\n * @param Clazz 需要渲染的目标对象\r\n * @returns {*}\r\n */\r\n static renderList(json: any, Clazz: any) {\r\n\r\n let target: any = []\r\n\r\n\r\n let arr: any = []\r\n\r\n if (json instanceof String || typeof json === \"string\") {\r\n\r\n arr = JsonUtil.parseList(json)\r\n\r\n } else if (json instanceof Array) {\r\n arr = json\r\n } else {\r\n\r\n console.error(\"源必须为字符或者数组\", json, typeof json)\r\n return target\r\n }\r\n\r\n //如果我们要转换成字符串的数组形式,那么this[field]应该是一个字符串才对。\r\n if (Clazz === String) {\r\n return arr\r\n }\r\n\r\n if (!Clazz || !(Clazz.prototype instanceof Base)) {\r\n console.error(\"指定的类型必须是 Base的子类 \")\r\n return target\r\n }\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n let bean = arr[i]\r\n\r\n let clazz = new Clazz()\r\n\r\n clazz.assign(bean)\r\n\r\n target.push(clazz)\r\n }\r\n\r\n return target\r\n }\r\n\r\n //直接render出一个Entity. field字段名,Clazz类名。\r\n assignEntity(field: any, Clazz: any) {\r\n\r\n let thisObj: any = this\r\n\r\n let obj: any = thisObj[field]\r\n if (!obj) {\r\n if (Clazz) {\r\n let EntityClazz: any = this.constructor\r\n obj = (new EntityClazz())[field]\r\n\r\n } else {\r\n return\r\n }\r\n }\r\n\r\n if (Clazz === Date) {\r\n\r\n thisObj[field] = DateUtil.str2Date(obj)\r\n\r\n } else if (Clazz.prototype instanceof Base) {\r\n\r\n //可能此处的该项属性做了特殊处理的。\r\n //1024*1024 以及 \"图片尺寸不超过1M\"用let bean = new Clazz(); 就无法反映出来。因为父类assign的时候已经将avatar给变成了Object.\r\n let bean = (new thisObj.constructor())[field]\r\n if (!bean) {\r\n bean = new Clazz()\r\n }\r\n\r\n\r\n if (typeof obj === \"string\") {\r\n try {\r\n obj = JSON.parse(obj)\r\n } catch (e) {\r\n console.error(\"JSON parse obj error\", e)\r\n }\r\n }\r\n\r\n if (obj !== null) {\r\n bean.assign(obj)\r\n thisObj[field] = bean\r\n }\r\n\r\n } else {\r\n console.error('调用错误!')\r\n }\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import SelectionOption from \"../base/option/SelectionOption\";\r\n\r\n\r\nenum WebResultCode {\r\n OK = \"OK\",\r\n BAD_REQUEST = \"BAD_REQUEST\",\r\n NEED_SHARE_CODE = \"NEED_SHARE_CODE\",\r\n SHARE_CODE_ERROR = \"SHARE_CODE_ERROR\",\r\n LOGIN = \"LOGIN\",\r\n NOT_INSTALLED = \"NOT_INSTALLED\",\r\n SERVER = \"SERVER\",\r\n UNKNOWN = \"UNKNOWN\",\r\n}\r\n\r\nlet WebResultCodes: WebResultCode[] = Object.keys(WebResultCode).map(k => k as WebResultCode)\r\n\r\nlet WebResultCodeMap: { [key in keyof typeof WebResultCode]: SelectionOption } = {\r\n OK: {\r\n \"name\": \"成功\",\r\n \"value\": \"OK\",\r\n },\r\n BAD_REQUEST: {\r\n \"name\": \"请求错误\",\r\n \"value\": \"BAD_REQUEST\",\r\n },\r\n NEED_SHARE_CODE: {\r\n name: \"提取码必填\",\r\n value: \"NEED_SHARE_CODE\"\r\n },\r\n SHARE_CODE_ERROR: {\r\n name: \"提取码错误\",\r\n value: \"SHARE_CODE_ERROR\"\r\n },\r\n LOGIN: {\r\n \"name\": \"未登录\",\r\n \"value\": \"LOGIN\",\r\n },\r\n NOT_INSTALLED: {\r\n \"name\": \"未安装\",\r\n \"value\": \"NOT_INSTALLED\",\r\n },\r\n SERVER: {\r\n \"name\": \"服务器出错\",\r\n \"value\": \"SERVER\",\r\n },\r\n UNKNOWN: {\r\n \"name\": \"未知错误\",\r\n \"value\": \"UNKNOWN\",\r\n },\r\n}\r\n\r\nlet WebResultCodeList: SelectionOption[] = []\r\nWebResultCodes.forEach((type: WebResultCode, index: number) => {\r\n WebResultCodeList.push(WebResultCodeMap[type])\r\n})\r\n\r\n\r\nexport {WebResultCode, WebResultCodes, WebResultCodeMap, WebResultCodeList}\r\n\r\n\r\n\r\n\r\n","/**\r\n *\r\n * 基类。\r\n *\r\n * 这个类附带了一个视图,通过对这个类的操作可以对对应的视图进行更新等操作。\r\n * Castle中的类,大多数直接继承这个类。\r\n */\r\nimport Base from \"./Base\";\r\nimport React from \"react\";\r\n\r\nexport default class ViewBase extends Base {\r\n\r\n //该类对应的React视图。\r\n reactComponent: React.Component | null = null\r\n\r\n //更新某一个组件对应的UI\r\n static updateComponentUI(component: React.Component | null, entity?: any) {\r\n if (component) {\r\n //_version在这里是充当fake的。\r\n component.setState({_version: new Date().getTime()})\r\n } else {\r\n console.warn(`${entity && entity.constructor ? entity.constructor.name : '未知对象'} 的 reactComponent 不存在,无法更新其对应的UI`)\r\n }\r\n }\r\n\r\n //更新当前的视图\r\n updateUI() {\r\n\r\n ViewBase.updateComponentUI(this.reactComponent, this)\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","/**\r\n * 全局性的对象,主要和整个框架相关的\r\n * 这个类不包含Base的子类,比如User, Preference.\r\n * 和Moon形成姊妹篇\r\n */\r\n\r\nexport default class Sun {\r\n\r\n //全局的一个store对象\r\n static singleton: Sun | null = null;\r\n\r\n //持有整个网站最外层的frame,方便我们刷新整个页面。\r\n frameComponent: any = null;\r\n\r\n //持有全局的react-router对象,方便我们在非jsx环境中控制路由跳转\r\n reactRouter: any = null;\r\n\r\n //全局布局样式,是否展示出左边的菜单.\r\n showDrawer: boolean = false;\r\n\r\n //全局mobile标识\r\n isMobile: boolean = /Mobile|iP(hone|od|ad)|iOS|Android|BlackBerry/i.test(window.navigator.userAgent);\r\n\r\n\r\n\r\n //由于这个类采用单例模式,因此所有属性都是独一份的。\r\n constructor() {\r\n\r\n }\r\n\r\n //使用懒加载模式。\r\n static getSingleton(): Sun {\r\n if (Sun.singleton == null) {\r\n Sun.singleton = new Sun();\r\n\r\n }\r\n return Sun.singleton\r\n }\r\n\r\n\r\n //*******************和路由相关的方法 开始 *******************//\r\n\r\n /**\r\n * 跳转到某个页面去\r\n */\r\n static navigateTo(path: any) {\r\n if (Sun.getSingleton().reactRouter) {\r\n Sun.getSingleton().reactRouter.push(path)\r\n } else {\r\n console.error(\"全局的 reactRouter 未定义,请检查代码!\")\r\n }\r\n }\r\n\r\n /**\r\n * 跳转到某个页面去,带query\r\n * route: {path: '', query: {}}\r\n */\r\n static navigateQueryTo(route: any) {\r\n let path = route.path;\r\n if (Object.keys(route.query).length) {\r\n const params = new URLSearchParams(route.query).toString();\r\n path += `?${params}`;\r\n }\r\n Sun.navigateTo(path);\r\n }\r\n\r\n /**\r\n * 回到上一页\r\n */\r\n static navigateBack() {\r\n if (Sun.getSingleton().reactRouter) {\r\n Sun.getSingleton().reactRouter.go(-1)\r\n } else {\r\n console.error(\"全局的 reactRouter 未定义,请检查代码!\")\r\n }\r\n }\r\n\r\n //******************* 和路由相关的方法 结束 *******************//\r\n\r\n //*******************和全局视图相关的方法 开始 *******************//\r\n /**\r\n * 刷新主框架内容\r\n */\r\n static updateFrame() {\r\n if (Sun.getSingleton().frameComponent) {\r\n Sun.getSingleton().frameComponent.updateUI()\r\n } else {\r\n console.error(\"全局的 frameComponent 未定义,请检查代码!\")\r\n }\r\n }\r\n\r\n //******************* 和全局视图相关的方法 结束 *******************//\r\n}\r\n","import {message} from 'antd';\r\n\r\n/**\r\n * 消息弹出框,统一进行收口\r\n */\r\nexport default class MessageBoxUtil {\r\n\r\n static success(content: string) {\r\n message.success(content)\r\n }\r\n\r\n static info(content: string) {\r\n message.info(content)\r\n }\r\n\r\n static error(content: string) {\r\n message.error(content)\r\n }\r\n\r\n static warn(content: string) {\r\n message.warn(content)\r\n }\r\n\r\n static warning(content: string) {\r\n message.warning(content)\r\n }\r\n\r\n}\r\n","import HttpUtil from \"../../util/HttpUtil\";\r\nimport SafeUtil from \"../../util/SafeUtil\";\r\nimport qs from \"qs\"\r\nimport React from \"react\";\r\nimport ViewBase from \"./ViewBase\";\r\nimport Sun from \"../global/Sun\";\r\nimport {WebResultCode} from \"./WebResultCode\";\r\nimport MessageBoxUtil from \"../../util/MessageBoxUtil\";\r\n\r\n/**\r\n * 基类。带有网络请求能力的基类\r\n * 继承了该类就表示具有了去服务器请求的能力。\r\n */\r\nexport default class HttpBase extends ViewBase {\r\n\r\n static lastLoginErrorTimestamp = 0\r\n\r\n //是否需要自动刷新State\r\n needReactComponentUpdate: boolean = true\r\n\r\n //当前是否正在进行http请求\r\n loading: boolean = false\r\n\r\n //请求http的时候是否有错误\r\n errorMessage: string | null = null\r\n\r\n //我们认为每个实体都会存放于某个react组件中,当然可以不传入。\r\n constructor(reactComponent?: React.Component | null) {\r\n\r\n super()\r\n\r\n if (reactComponent) {\r\n this.reactComponent = reactComponent\r\n }\r\n\r\n }\r\n\r\n\r\n //更新当前的视图,只在需要更新的情况下才更新。\r\n updateUI() {\r\n if (this.needReactComponentUpdate && this.reactComponent) {\r\n ViewBase.updateComponentUI(this.reactComponent, this)\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 转跳到登录页面\r\n */\r\n jumpLogin() {\r\n\r\n Sun.navigateTo(\"/user/login\")\r\n\r\n\r\n }\r\n\r\n /**\r\n * 转跳到网站安装页面\r\n */\r\n jumpInstall() {\r\n\r\n Sun.navigateTo(\"/install/index\")\r\n\r\n }\r\n\r\n //从一个返回中获取出其错误信息。适配各种错误的类型。\r\n getErrorMessage(response: any) {\r\n\r\n console.error(\"getErrorMessage\", response)\r\n let msg = '服务器出错,请稍后再试!'\r\n\r\n if (!response) {\r\n msg = '出错啦,请稍后重试!'\r\n } else if (typeof response === 'string') {\r\n msg = response\r\n } else if (response['msg']) {\r\n msg = response['msg']\r\n } else if (response['message']) {\r\n msg = response['message']\r\n } else {\r\n let temp = response['data']\r\n if (temp !== null && typeof temp === 'object') {\r\n if (temp['message']) {\r\n msg = temp['message']\r\n } else if (temp['msg']) {\r\n msg = temp['msg']\r\n } else {\r\n if (temp['error'] && temp['error']['message']) {\r\n msg = temp['error']['message']\r\n }\r\n }\r\n }\r\n }\r\n this.errorMessage = msg\r\n return msg\r\n }\r\n\r\n\r\n //提供全局的默认处理方式,可以自定义错误处理\r\n defaultErrorHandler(response: any, errorCallback?: any) {\r\n\r\n let msg = this.getErrorMessage(response)\r\n\r\n console.error(\"请求出错了\", typeof msg, msg)\r\n\r\n if (typeof errorCallback === 'function') {\r\n errorCallback(msg, response)\r\n } else {\r\n MessageBoxUtil.error(msg)\r\n }\r\n\r\n }\r\n\r\n\r\n //专门捕捉没有登录这种错误。return true -> 有错误(已经处理掉了) false -> 没错误 (什么都没干)\r\n specialErrorHandler(response: any) {\r\n\r\n if (!response || !response.data) {\r\n return false\r\n }\r\n\r\n //1.判断是不是登录错误\r\n if (response.data[\"code\"] === WebResultCode.LOGIN) {\r\n\r\n //这个问题不能报的太频繁,比如一个页面请求了两个接口,两个接口都报没有登录。\r\n if ((new Date().getTime()) - HttpBase.lastLoginErrorTimestamp < 3000) {\r\n return true\r\n } else {\r\n HttpBase.lastLoginErrorTimestamp = (new Date().getTime());\r\n }\r\n\r\n MessageBoxUtil.error(\"您尚未登录,请登录后访问!\")\r\n\r\n //立即进行登录跳转。\r\n this.jumpLogin()\r\n\r\n return true;\r\n }\r\n\r\n\r\n return false\r\n\r\n }\r\n\r\n\r\n /**\r\n * 基类中的http请求会去统一处理错误情况。\r\n * 1.登录过期\r\n *\r\n */\r\n httpGet(url: any, params = {}, successCallback?: any, errorCallback?: any, finallyCallback?: any, opts?: any) {\r\n\r\n let that = this\r\n\r\n if (!opts) {\r\n opts = {}\r\n }\r\n\r\n\r\n that.loading = true\r\n\r\n //更新react控件的状态\r\n that.updateUI()\r\n\r\n return HttpUtil.httpGet(url, params, function (response: any) {\r\n //有可能正常接口回来的数据也是错误的。交给错误处理器处理。\r\n if (that.specialErrorHandler(response)) {\r\n\r\n SafeUtil.safeCallback(errorCallback)(response)\r\n return\r\n }\r\n\r\n\r\n SafeUtil.safeCallback(successCallback)(response)\r\n\r\n }, function (err: any) {\r\n\r\n let response = err.response\r\n console.error(\"请求出错啦\", response)\r\n\r\n //特殊错误情况的通用处理方式\r\n if (that.specialErrorHandler(response)) {\r\n return\r\n }\r\n\r\n\r\n that.defaultErrorHandler(response, errorCallback)\r\n\r\n }, function (res: any) {\r\n\r\n that.loading = false\r\n\r\n //更新react控件的状态\r\n that.updateUI()\r\n\r\n SafeUtil.safeCallback(finallyCallback)(res)\r\n\r\n }, opts);\r\n }\r\n\r\n /**\r\n * 基类中纯粹的http get请求。\r\n *\r\n */\r\n httpPureGet(url: any, params = {}, successCallback?: any, errorCallback?: any, finallyCallback?: any, opts?: any) {\r\n\r\n let that = this\r\n\r\n if (!opts) {\r\n opts = {}\r\n }\r\n\r\n return HttpUtil.httpGet(url, params, function (response: any) {\r\n SafeUtil.safeCallback(successCallback)(response)\r\n }, function (err: any) {\r\n SafeUtil.safeCallback(errorCallback)(that.getErrorMessage(err.response))\r\n }, function (res: any) {\r\n SafeUtil.safeCallback(finallyCallback)(res)\r\n }, opts);\r\n }\r\n\r\n\r\n /**\r\n * 基类中的http请求会去统一处理错误情况。\r\n * 1.登录过期\r\n *\r\n */\r\n httpPost(url: any, params = {}, successCallback?: any, errorCallback?: any, finallyCallback?: any, opts?: any) {\r\n\r\n let that = this\r\n\r\n if (!opts) {\r\n opts = {}\r\n }\r\n\r\n that.loading = true\r\n\r\n //更新react控件的状态\r\n that.updateUI()\r\n\r\n\r\n let formData = qs.stringify(params);\r\n\r\n if (!opts[\"headers\"]) {\r\n opts[\"headers\"] = {}\r\n }\r\n opts[\"headers\"]['Content-Type'] = 'application/x-www-form-urlencoded'\r\n\r\n\r\n return HttpUtil.httpPost(url, formData, function (response: any) {\r\n\r\n //有可能正常接口回来的数据也是错误的。交给错误处理器处理。\r\n if (that.specialErrorHandler(response)) {\r\n\r\n SafeUtil.safeCallback(errorCallback)(response)\r\n return\r\n }\r\n\r\n SafeUtil.safeCallback(successCallback)(response)\r\n\r\n }, function (err: any) {\r\n\r\n let response = err.response\r\n\r\n console.error(\"请求出错啦\", response ? response : err)\r\n\r\n //特殊错误情况的通用处理方式\r\n if (that.specialErrorHandler(response)) {\r\n return\r\n }\r\n\r\n that.defaultErrorHandler(response, errorCallback)\r\n\r\n }, function (res: any) {\r\n\r\n that.loading = false\r\n\r\n //更新react控件的状态\r\n that.updateUI()\r\n\r\n SafeUtil.safeCallback(finallyCallback)(res)\r\n\r\n }, opts);\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","enum Color {\n PRIMARY = \"#215891\",\n INFO = \"#2DB7F5\",\n SUCCESS = \"#67C23A\",\n WARNING = \"#E6A23C\",\n DANGER = \"#FF756F\",\n}\n\nexport default Color\n","import StringUtil from '../../util/StringUtil';\r\nimport SafeUtil from '../../util/SafeUtil';\r\nimport SortFilter from './filter/SortFilter';\r\nimport Filter from './filter/Filter';\r\nimport HttpBase from './HttpBase';\r\n\r\n\r\n/**\r\n * 实体基类\r\n * 继承这个类的表示在数据库中有对应的表。\r\n */\r\nexport default class BaseEntity extends HttpBase {\r\n\r\n /**\r\n * 唯一标识\r\n */\r\n uuid: string | null = null;\r\n\r\n /**\r\n * 排序值\r\n */\r\n sort: number = 0;\r\n\r\n /**\r\n * 创建时间\r\n */\r\n createTime: Date | null = null;\r\n\r\n /**\r\n * 修改时间\r\n */\r\n updateTime: Date | null = null;\r\n\r\n\r\n //************ 前端辅助字段 ****************/\r\n //加载详情的指示\r\n detailLoading: boolean = false;\r\n\r\n\r\n //我们认为每个实体都会存放于某个react组件中,当然可以不传入。\r\n constructor(reactComponent?: React.Component | null) {\r\n\r\n super(reactComponent);\r\n\r\n }\r\n\r\n //把obj中的属性,赋值到this中来。采用深拷贝。\r\n assign(obj: any) {\r\n super.assign(obj);\r\n\r\n this.assignEntity('createTime', Date);\r\n this.assignEntity('updateTime', Date);\r\n\r\n }\r\n\r\n //获取过滤器,必须每次动态生成,否则会造成filter逻辑混乱。\r\n getFilters(): Filter[] {\r\n return [\r\n new SortFilter('修改时间排序', 'orderCreateTime'),\r\n new SortFilter('创建时间排序', 'orderUpdateTime'),\r\n ];\r\n };\r\n\r\n\r\n //提交之前对自己进行验证。返回错误信息,null表示没有错误。\r\n validate(): any {\r\n\r\n return null;\r\n }\r\n\r\n //提交的表单\r\n getForm(): any {\r\n console.error('getForm: you should override this base method.');\r\n }\r\n\r\n //获取到当前类的单数标签。比如 Project便得到 project\r\n getTAG(): string {\r\n\r\n let className = this.constructor.name;\r\n\r\n //IE无法直接通过this.constructor.name获取到相应名称\r\n if (!className) {\r\n className = StringUtil.functionName(this.constructor);\r\n }\r\n\r\n return StringUtil.lowerCamel(className);\r\n }\r\n\r\n\r\n //获取到当前实体的url前缀。比如Notification获取到 /api/fs/notification\r\n getUrlPrefix(): string {\r\n return '/api' + StringUtil.lowerSlash(this.getTAG());\r\n }\r\n\r\n\r\n getUrlCreate(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/create';\r\n }\r\n\r\n getUrlDel(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/delete';\r\n\r\n }\r\n\r\n getUrlEdit(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/edit';\r\n }\r\n\r\n getUrlDetail(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/detail';\r\n }\r\n\r\n getUrlList(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/page';\r\n }\r\n\r\n getUrlSort(): string {\r\n let prefix = this.getUrlPrefix();\r\n\r\n return prefix + '/sort';\r\n }\r\n\r\n\r\n //新增或者修改\r\n httpSave(successCallback?: any, errorCallback?: any, finallyCallback?: any) {\r\n\r\n let that = this;\r\n\r\n let url = this.getUrlCreate();\r\n if (this.uuid) {\r\n url = this.getUrlEdit();\r\n }\r\n\r\n\r\n this.errorMessage = this.validate();\r\n if (this.errorMessage) {\r\n that.defaultErrorHandler(this.errorMessage, errorCallback);\r\n return;\r\n }\r\n\r\n this.httpPost(url, this.getForm(), function(response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finallyCallback);\r\n\r\n }\r\n\r\n\r\n //common http detail methods.\r\n httpDetail(successCallback?: any, errorCallback?: any, finallyCallback?: any) {\r\n\r\n let that = this;\r\n if (!this.uuid) {\r\n\r\n this.errorMessage = 'uuid未指定,无法获取到详情!';\r\n\r\n this.defaultErrorHandler(this.errorMessage, errorCallback);\r\n\r\n return;\r\n }\r\n\r\n let url = this.getUrlDetail() + '?uuid=' + this.uuid;\r\n\r\n this.detailLoading = true;\r\n\r\n this.httpGet(url, {}, function(response: any) {\r\n that.detailLoading = false;\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, function(response: any) {\r\n\r\n that.detailLoading = false;\r\n\r\n if (typeof errorCallback === 'function') {\r\n errorCallback(that.getErrorMessage(response), response);\r\n } else {\r\n //没有传入错误处理的方法就采用默认处理方法:toast弹出该错误信息。\r\n that.defaultErrorHandler(response);\r\n }\r\n }, finallyCallback);\r\n\r\n }\r\n\r\n\r\n httpDel(successCallback?: any, errorCallback?: any, finallyCallback?: any) {\r\n\r\n let that = this;\r\n if (!this.uuid) {\r\n\r\n this.errorMessage = '没有id,无法删除!';\r\n that.defaultErrorHandler(this.errorMessage, errorCallback);\r\n\r\n return;\r\n }\r\n\r\n let url = this.getUrlDel() + '?uuid=' + this.uuid;\r\n\r\n this.httpPost(url, {}, function(response: any) {\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finallyCallback);\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import ColorSelectionOption from \"../base/option/ColorSelectionOption\";\r\nimport Color from \"../base/option/Color\";\r\nimport Lang from \"../global/Lang\";\r\n\r\n\r\nenum UserRole {\r\n GUEST = 'GUEST',\r\n USER = 'USER',\r\n ADMINISTRATOR = 'ADMINISTRATOR',\r\n}\r\n\r\nlet UserRoles: UserRole[] = Object.keys(UserRole).map(k => k as UserRole);\r\n\r\nlet UserRoleMap: { [key in keyof typeof UserRole]: ColorSelectionOption } = {\r\n GUEST: {\r\n 'name': Lang.t(\"user.roleGuest\"),\r\n 'value': 'GUEST',\r\n 'color': Color.WARNING,\r\n },\r\n USER: {\r\n 'name': Lang.t(\"user.roleUser\"),\r\n 'value': 'USER',\r\n 'color': Color.PRIMARY,\r\n },\r\n ADMINISTRATOR: {\r\n 'name': Lang.t(\"user.roleAdministrator\"),\r\n 'value': 'ADMINISTRATOR',\r\n 'color': Color.DANGER,\r\n },\r\n\r\n};\r\n\r\nlet UserRoleList: ColorSelectionOption[] = [];\r\nUserRoles.forEach((type: UserRole, index: number) => {\r\n UserRoleList.push(UserRoleMap[type]);\r\n});\r\n\r\n\r\nexport {UserRole, UserRoles, UserRoleMap, UserRoleList};\r\n\r\n\r\n\r\n\r\n","export default class BrowserUtil {\r\n\r\n //根据cookie键,读取cookie值\r\n static readCookie(name: any) {\r\n let nameEQ = name + \"=\";\r\n let ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n }\r\n\r\n\r\n /**\r\n *\r\n * 获取url地址栏的参数\r\n * // query string: ?foo=lorem&bar=&baz\r\n * var foo = getQueryByName('foo'); // \"lorem\"\r\n * var bar = getQueryByName('bar'); // \"\" (present with empty value)\r\n * var baz = getQueryByName('baz'); // \"\" (present with no value)\r\n * var qux = getQueryByName('qux'); // null (absent)\r\n * @param name\r\n * @param url\r\n * @returns {*}\r\n */\r\n static getQueryByName(name: string, url?: string): string | null {\r\n\r\n if (!url) {\r\n url = window.location.href\r\n }\r\n\r\n name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n\r\n let regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\")\r\n let results = regex.exec(url);\r\n\r\n if (!results) {\r\n return null;\r\n }\r\n\r\n if (!results[2]) {\r\n return \"\";\r\n }\r\n\r\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n }\r\n\r\n\r\n /**\r\n * 半颜的方法。注释待补充\r\n * @param name\r\n * @returns {*}\r\n */\r\n static getQueryString(name: any) {\r\n let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');\r\n let r = window.location.search.substr(1).match(reg);\r\n if (r != null) return unescape(r[2]);\r\n return null;\r\n }\r\n\r\n\r\n static isLocalStorageNameSupported() {\r\n let testKey = 'test';\r\n let storage = window.localStorage;\r\n try {\r\n storage.setItem(testKey, '1');\r\n storage.removeItem(testKey);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n\r\n static readLocalStorage(key: any) {\r\n if (BrowserUtil.isLocalStorageNameSupported()) {\r\n return window.localStorage[key];\r\n } else {\r\n console.error(\"not support localStorage.\");\r\n return null;\r\n }\r\n }\r\n\r\n static saveToLocalStorage(key: any, content: any) {\r\n if (BrowserUtil.isLocalStorageNameSupported()) {\r\n window.localStorage[key] = content;\r\n } else {\r\n console.error(\"not support localStorage.\");\r\n }\r\n }\r\n\r\n\r\n static removeLocalStorage(key: any) {\r\n if (BrowserUtil.isLocalStorageNameSupported()) {\r\n window.localStorage.removeItem(key);\r\n } else {\r\n console.error(\"not support localStorage.\");\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 获取完整的host\r\n * eg:\r\n * https://tank.eyeblue.cn\r\n */\r\n static fullHost() {\r\n return window.location.protocol + \"//\" + window.location.host\r\n }\r\n\r\n\r\n //只支持zh和en\r\n static browserLang() {\r\n //常规浏览器语言和IE浏览器\r\n let lang = navigator.language || (navigator as any).userLanguage;\r\n\r\n //截取lang前2位字符\r\n lang = lang.substr(0, 2);\r\n if (lang === \"zh\") {\r\n return \"zh\"\r\n } else {\r\n return \"en\"\r\n }\r\n }\r\n\r\n}\r\n","let LangEn = {\r\n eyeblueTank: \"EyeblueTank\",\r\n dashboard: {\r\n totalInvokeNum: 'Total PV',\r\n weekRate: 'Week',\r\n dayRate: 'Day',\r\n yesterdayInvoke: 'Yesterday PV',\r\n totalUV: 'Total UV',\r\n yesterdayUV: 'Yesterday UV',\r\n totalMatterNum: 'Total file num',\r\n yesterdayMatterNum: 'Yesterday File Num',\r\n totalFileSize: 'Total File Size',\r\n yesterdayMatterSize: 'Yesterday File Size',\r\n recentDayInvokeUV: 'Recent {} days PV/UV',\r\n downloadMatterTop10: 'File download TOP10',\r\n activeIpTop10: 'Active IP TOP10',\r\n loading: 'loading...',\r\n date: 'Date',\r\n num: 'Num',\r\n warnHint: 'Hint: data in this page updates everyday at 0.a.m. ',\r\n reRun: 'ReRun',\r\n },\r\n install: {\r\n configMysql: \"Config MySQL\",\r\n port: \"Port\",\r\n schema: \"Schema\",\r\n username: \"Username\",\r\n password: \"Password\",\r\n charset: \"Charset\",\r\n mysqlConnectionPass: \"Connect MySQL Ok\",\r\n testMysqlConnection: \"Tes MySQL Connection\",\r\n notice: \"Notice\",\r\n mysqlNotice1: \"If Mysql and EyeblueTank installed on the same server, Host is 127.0.0.1\",\r\n mysqlNotice2: \"Your mysql account must have access to create table, or the second step will fail.\",\r\n validateMysqlFirst: \"Please test the mysql connection firstly.\",\r\n preStep: \"Pre Step\",\r\n nextStep: \"Next Step\",\r\n createTable: \"Craete Tables\",\r\n installed: \"Installed\",\r\n installedButMissing: \"Installed, but missing fields\",\r\n toBeInstalled: \"To be installed\",\r\n allFields: \"All fields\",\r\n missingFields: \"Missing fields\",\r\n tableNotice: \"'Create Tables' will trigger the following actions:\",\r\n tableNotice1: \"If a table not exist, create it.\",\r\n tableNotice2: \"If a table exist and no fields missing, nothing will do on this table.\",\r\n tableNotice3: \"If a table exist but some fields is missing, it will add the missing fields.\",\r\n tableNotice4: \"If a table exist and some fields not necessary, nothing will do on this table.\",\r\n oneKeyCreate: \"Create Tables\",\r\n createFinish: \"Finish Creating Tables\",\r\n createTableSuccess: \"Create tables successfully\",\r\n crateTableFirst: \"Please click 'Create Tables'\",\r\n setAdministrator: \"Config Administrator\",\r\n detectAdministrator: \"Detect the following administrators:\",\r\n useOrCreateAdministrator: \"You can validate one of them, or you can create a new one.\",\r\n validateAdministrator: \"Validate administrator\",\r\n createAdministrator: \"Create administrator\",\r\n administratorUsername: \"username\",\r\n administratorPassword: \"password\",\r\n administratorRePassword: \"Enter administrator password again\",\r\n usernameRule: \"EyeblueTank will use username as directory name, so only lowercase letter and number and _ is permitted.\",\r\n congratulationInstall: \"Congratulations, install successfully!\",\r\n configAdminFirst: \"Please config administrator first.\",\r\n createAdminSuccess: \"Create administrator successfully!\",\r\n validateAdminSuccess: \"Validate administrator successfully!\",\r\n pressToHome: \"Click the button below to enter home。\",\r\n enterHome: \"Finish And Enter Home\",\r\n finish: \"Finish\",\r\n },\r\n layout: {\r\n allFiles: \"Files\",\r\n myShare: \"My Share\",\r\n bin: \"Recycle bin\",\r\n setting: \"Setting\",\r\n dashboard: \"Dashboard\",\r\n users: \"Users\",\r\n logout: \"Logout\",\r\n about: \"About\",\r\n install: \"Install\",\r\n dragMouseUp: \"Put file here~\"\r\n },\r\n matter: {\r\n file: \"File\",\r\n directory: \"Directory\",\r\n rename: \"Rename\",\r\n download: \"Download\",\r\n delete: \"Delete\",\r\n hardDelete: \"Hard delete\",\r\n recovery: \"Recovery\",\r\n more: \"More\",\r\n share: \"Share\",\r\n close: \"Close\",\r\n size: \"Size\",\r\n preview: \"Preview\",\r\n move: \"Move\",\r\n moveTo: \"MoveTo\",\r\n upload: \"Upload\",\r\n create: \"Create\",\r\n createTime: \"Create Time\",\r\n updateTime: \"Update Time\",\r\n deleteTime: \"Deleted Time\",\r\n root: \"Root\",\r\n fillInPicLink: \"Fill in Picture Link\",\r\n rePick: \"Re Choose\",\r\n chooseImage: \"Choose Image\",\r\n uploadMode: \"Upload Mode\",\r\n fillMode: \"Fill Mode\",\r\n sizeExceedLimit: \"File size exceed limit {}>{}\",\r\n setPublic: \"Set as public\",\r\n setPrivate: \"Set as private\",\r\n copyLink: \"Copy Link\",\r\n enterName: \"Please enter name\",\r\n publicFileEveryoneCanVisit: \"Public file, anyone can access\",\r\n fileDetail: \"File info\",\r\n expire: \"Expire\",\r\n copyLinkAndCode: \"Copy link and code\",\r\n uploaded: \"Uploaded\",\r\n uploadDir: 'Upload dir',\r\n uploadInfo: 'Upload Info',\r\n uploadErrorInfo: 'Some files failed to upload, you can export CSV files for viewing',\r\n exportCSV: 'Export upload error detail',\r\n speed: \"Speed\",\r\n fileInfo: \"File basic info\",\r\n fileName: \"Filename\",\r\n path: \"Path\",\r\n copyPath: \"Copy path\",\r\n publicOrPrivate: \"Public or private\",\r\n privateInfo: \"Private file, only self or auth user can download\",\r\n publicInfo: \"Public file, anyone can download\",\r\n downloadTimes: \"Download times\",\r\n operations: \"Operation\",\r\n oneTimeLink: \"One time link\",\r\n oneTimeLinkInfo: \"One time link will expire after downloading, click to copy\",\r\n imageCache: \"Image cache\",\r\n searchFile: \"Search file\",\r\n noContentYet: \"No content under this directory yet\",\r\n allFiles: \"All Files\",\r\n newDirectory: \"New directory\",\r\n notChoose: \"Not choose any file\",\r\n exceed1000: \"Exceed file limit 1000\",\r\n noImageCache: \"No image cache\",\r\n recycleBin: \"Recycle bin\",\r\n deleted: \"Deleted\",\r\n unCompatibleBrowser: \"The current browser does not support it. Please try choose another one\",\r\n canIUse: \"To see if the current browser supports it\",\r\n intoRecycleBin: \"Recycle bin\",\r\n finishingTip: \"Please wait while files are sorted...\"\r\n },\r\n router: {\r\n allFiles: \"All Files\",\r\n fileDetail: \"File Detail\",\r\n login: \"Login\",\r\n autoLogin: \"Auto Login\",\r\n register: \"Register\",\r\n users: \"Users\",\r\n userDetail: \"User Detail\",\r\n changePassword: \"Change password\",\r\n editUser: \"Edit User\",\r\n createUser: \"Create User\",\r\n shareDetail: \"Share Detail\",\r\n myShare: \"My Share\",\r\n dashboard: \"Dashboard\",\r\n install: \"Install\",\r\n setting: \"Setting\"\r\n },\r\n preference: {\r\n basic: \"Base Info\",\r\n preview: \"Preview Conf\",\r\n scan: \"Scan Disk\",\r\n websiteName: \"Website Name\",\r\n logo: \"Logo\",\r\n logoSquare: \"Logo will be cropped to square size\",\r\n onlyAllowIco: \"Only .ico allowed\",\r\n copyright: \"Copyright (support html)\",\r\n extraInfo: \"Extra info (support html)\",\r\n zipMaxNumLimit: \"Zip download max num limit\",\r\n zipMaxSizeLimit: \"Zip download max size limit(B)\",\r\n current: \"Current\",\r\n noLimit: \"No limit\",\r\n userDefaultSizeLimit: \"User default size limit(B) \",\r\n matterBinDefaultSaveDay: \"Matter bin storage days\",\r\n enterMatterBinDefaultSaveDay: \"Please enter matter bin storage days!\",\r\n docLink: \"Document Link\",\r\n tankDocLink: \"https://tank-doc.eyeblue.cn\",\r\n allowRegister: \"Allow register\",\r\n systemCleanup: \"System Cleanup\",\r\n systemCleanupDescription: \"This operation will cleanup everything except administrators' data\",\r\n systemCleanupPrompt: \"This operation will cleanup everything except administrators' account data, please input login password.\",\r\n previewConfig: \"File Preview Config\",\r\n editPreference: \"Edit Preference\",\r\n editPreviewEngine: \"Edit Preview engine\",\r\n enterWebsiteName: \"Please enter website name!\",\r\n enterZipMaxNumLimit: \"Please enter zip max num!\",\r\n enterZipMaxSizeLimit: \"Please enter zip max size!\",\r\n enterUserDefaultSizeLimit: \"Please enter user's default size!\",\r\n engine: \"The number {} engine\",\r\n noEngine: \"No preview engine\",\r\n newEngine: \"Add a preview engine\",\r\n engineReg: \"Engine format\",\r\n engineSuffix: \"Engine suffix\",\r\n enginePreview: \"Engine preview\",\r\n defaultPreview: \"Default preview engine\",\r\n previewEngine: \"Number {} preview engine\",\r\n defaultPreviewDesc: \"Default preview engine, can not be removed\",\r\n engineUsageHint: \"Previewing a file using the first engine matches the extentions.\",\r\n engineRegHelper: \"template syntax, {url} represents the file path, the preview will automatically replace with the corresponding file url\",\r\n engineRegPlaceHolder: \"eg:https://xxx.xxx.xxx?url={url}\",\r\n engineSuffixPlaceHolder: \"suffix can not be null, split by comma, look like: doc,ppt,xls\",\r\n previewCurrent: \"preview in current page\",\r\n previewOpen: \"preview in new page\",\r\n editScan: \"Edit Scan disk\",\r\n enableScan: \"Enable Scan disk\",\r\n disabledScan: \"Disabled Scan disk\",\r\n scanCron: \"Regularly Scan disk\",\r\n cron: \"Cron expression\",\r\n cronValidate: \"Cron expression can not be null\",\r\n scanScope: \"Scan scope\",\r\n scanUsers: \"Scan users\",\r\n scanPerTenSeconds: \"Scan every ten seconds\",\r\n scanPerThirtySeconds: \"Scan every thirty seconds\",\r\n scanPerMinute: \"Scan every minute\",\r\n scanPerHour: \"Scan every hour\",\r\n scanCustom: \"Scan custom\",\r\n chooseUsers: \"Fuzzy search users\",\r\n chooseUsersValidate: \"choose one more user\",\r\n scanLoading: \"waiting...\",\r\n matterBinDefaultTip: \"set zero means to turn off the recycle bin\"\r\n },\r\n share: {\r\n shareDetail: \"Share Detail\",\r\n shareTime: \"Share Time\",\r\n expireTime: \"Expire Time\",\r\n noExpire: \"Never Expire\",\r\n expired: \"Expired\",\r\n copyLinkAndCode: \"Copy Link And Code\",\r\n shareSuccess: \"Share Successfully\",\r\n sharer: \"Share Person\",\r\n link: \"Link\",\r\n copyLink: \"Copy Link\",\r\n code: \"Code\",\r\n copyCode: \"Copy Code\",\r\n copySuccess: \"Copy Successfully\",\r\n more: \"More\",\r\n cancelShare: \"Cancel Share\",\r\n getLink: \"Get Link\",\r\n allFiles: \"All Files\",\r\n noContent: \"No content in this directory\",\r\n enterCode: \"Please enter code\",\r\n getFiles: \"Get Files\",\r\n codeError: \"Code Error\",\r\n cancelPrompt: \"This operation will cancel sharing forever, continue?\",\r\n hour: \"1 Hour\",\r\n day: \"1 Day\",\r\n week: \"1 Week\",\r\n month: \"1 Month\",\r\n year: \"1 Year\",\r\n infinity: \"Forever\",\r\n emptyHint: \"No Share Yet\",\r\n },\r\n user: {\r\n redirecting: \"Redirecting...\",\r\n oldPassword: \"Old Password\",\r\n newPassword: \"New Password\",\r\n confirmNewPassword: \"Confirm New Password\",\r\n cannotBeNull: \"Cannot be null!\",\r\n passwordNotSame: \"passwords above not same!\",\r\n role: \"Role\",\r\n singleFileSizeLimit: \"Single File Limit\",\r\n totalFileSizeLimit: \"Total Space Limit\",\r\n current: \"Current\",\r\n noLimit: \"No Limit\",\r\n totalFileSize: \"Used Space\",\r\n status: \"Status\",\r\n lastLogin: \"Last Login\",\r\n lastLoginIp: \"Last Login Ip\",\r\n lastLoginTime: \"Last Login Time\",\r\n resetPassword: \"Reset Password\",\r\n transfiguration: \"Transfiguration\",\r\n changePassword: \"Edit Password\",\r\n enterPassword: \"Please Enter Password\",\r\n enterUsername: \"Please Enter Username\",\r\n enterNewPassword: \"Please Enter New Password\",\r\n profile: \"Profile\",\r\n avatar: \"Avatar\",\r\n username: \"Username\",\r\n password: \"Password\",\r\n confirmPassword: \"Confirm Password\",\r\n disabled: \"Disabled\",\r\n disableUser: \"Disable this user\",\r\n disable: \"Disable\",\r\n active: \"Active\",\r\n sync: \"Sync\",\r\n activeUser: \"Active this user\",\r\n deleteUser: \"Delete this user\",\r\n deleteHint: \"This action will delete {}'s all records, including files,shares,user infos etc. Continue?\",\r\n welcomeLogin: \"Welcome Login\",\r\n logining: \"Login...\",\r\n login: \"Login\",\r\n loginSuccess: \"Login Success\",\r\n toToRegister: \"Go To Register\",\r\n welcomeRegister: \"Welcome Register\",\r\n registering: \"Login...\",\r\n register: \"Register\",\r\n goToLogin: \"Go To Login\",\r\n roleGuest: \"Guest\",\r\n roleUser: \"User\",\r\n roleAdministrator: \"Administrator\",\r\n statusActive: \"Ok\",\r\n statusDisabled: \"Disabled\",\r\n webdavLink: \"WebDAV Link\",\r\n docLink: \"Document Link\",\r\n createUser: \"Create User\",\r\n editUser: \"Edit User\",\r\n editSomebodyPassword: \"Edit {}'s Password\",\r\n transfigurationPromptText: \"Transfiguration Prompt\",\r\n transfigurationPrompt: \"You will login as this user.Please visit this link in other browser, if in current browser, you will logout.\",\r\n allUsers: \"All users\",\r\n partialUsers: \"Partial users\"\r\n },\r\n model: {\r\n usernameRule: \"only lowercase letter and number and _ is permitted.\",\r\n passwordRule: \"Password must have more than 6 chars\",\r\n linkCodeText: \"Link:{} Code:{}\",\r\n copyLinkCodeSuccess: \"Copy Link and Code successfully\",\r\n\r\n },\r\n plugin: {\r\n cannotPreview: \"Cannot Preview\",\r\n emptyHintDefault: \"No Items\",\r\n everyPage: \"Every Page\",\r\n items: \"Items\",\r\n total: \"Total\",\r\n clickRefresh: \"Click To Refresh\",\r\n },\r\n loading: \"Loading\",\r\n selectAll: \"All\",\r\n edit: \"Edit\",\r\n createTime: \"Create Time\",\r\n download: \"Download\",\r\n close: \"Close\",\r\n required: \"Required\",\r\n cancel: \"Cancel\",\r\n delete: \"Delete\",\r\n actionCanNotRevertConfirm: \"This action cannot be reverted, confirm?\",\r\n actionDeleteConfirm: \"Delete, confirm?\",\r\n actionRecoveryConfirm: \"Recovery, confirm?\",\r\n prompt: \"Prompt\",\r\n confirm: \"Confirm\",\r\n copy: \"Copy\",\r\n copySuccess: \"Copy Success!\",\r\n copyError: \"Copy Error!\",\r\n showMore: \"Show More\",\r\n username: \"Username\",\r\n password: \"Password\",\r\n submit: \"Submit\",\r\n save: \"Save\",\r\n create: \"Create\",\r\n finish: \"Finish\",\r\n operationSuccess: \"Operation success\",\r\n operation: \"Operation\",\r\n notFound: \"404 Not Found\",\r\n login: \"Login\",\r\n logout: \"Logout\",\r\n yes: \"Yes\",\r\n no: \"No\",\r\n all: \"All\",\r\n refresh: \"refresh\",\r\n inputRequired: \"Input required\",\r\n}\r\n\r\nexport default LangEn\r\n","let LangZh = {\r\n eyeblueTank: \"蓝眼云盘\",\r\n dashboard: {\r\n totalInvokeNum: '总PV',\r\n weekRate: '周环比',\r\n dayRate: '日环比',\r\n yesterdayInvoke: '昨日PV',\r\n totalUV: '总UV',\r\n yesterdayUV: '昨日UV',\r\n totalMatterNum: '总文件数',\r\n yesterdayMatterNum: '昨日文件数',\r\n totalFileSize: '文件总大小',\r\n yesterdayMatterSize: '昨日文件大小',\r\n recentDayInvokeUV: '最近{}日PV/UV',\r\n downloadMatterTop10: '文件下载量TOP10',\r\n activeIpTop10: '活跃IP TOP10',\r\n loading: '加载中…',\r\n date: '日期',\r\n num: '数量',\r\n warnHint: '温馨提示:本页面数据每日凌晨0点清洗一次。',\r\n reRun: '立即重跑',\r\n },\r\n install: {\r\n configMysql: \"配置MySQL\",\r\n port: \"端口\",\r\n schema: \"库名\",\r\n username: \"用户名\",\r\n password: \"密码\",\r\n charset: \"编码\",\r\n mysqlConnectionPass: \"MySQL连接测试通过\",\r\n testMysqlConnection: \"测试MySQL连接\",\r\n notice: \"注意\",\r\n mysqlNotice1: \"如果数据库和蓝眼云盘安装在同一台服务器,Host可以直接填写 127.0.0.1。\",\r\n mysqlNotice2: \"数据库账户的权限要求要能够创建表,否则第二步\\\"创建表\\\"操作会出错\",\r\n validateMysqlFirst: \"请首先验证数据库连接\",\r\n preStep: \"上一步\",\r\n nextStep: \"下一步\",\r\n createTable: \"创建表\",\r\n installed: \"已安装\",\r\n installedButMissing: \"已安装,字段缺失\",\r\n toBeInstalled: \"待安装\",\r\n allFields: \"所有字段\",\r\n missingFields: \"缺失字段\",\r\n tableNotice: \"点击\\\"一键建表\\\"后会按照以下逻辑执行操作:\",\r\n tableNotice1: \"如果某表不存在,则直接创建表。\",\r\n tableNotice2: \"如果某表存在并且字段齐全,那么不会对该表做任何操作。\",\r\n tableNotice3: \"如果某表存在但是部分字段缺失,那么会在该表中增加缺失字段。\",\r\n tableNotice4: \"如果表中有多余的字段(多余字段即不是蓝眼云盘需要的字段),不会做删除处理,而会维持原样。\",\r\n oneKeyCreate: \"一键建表\",\r\n createFinish: \"建表完成\",\r\n createTableSuccess: \"建表成功\",\r\n crateTableFirst: \"请首先点击'一键建表'\",\r\n setAdministrator: \"设置管理员\",\r\n detectAdministrator: \"检测到系统中已经存在有以下管理员:\",\r\n useOrCreateAdministrator: \"你可以使用其中一位管理员的用户名和密码进行验证,或者创建一位新的管理员账户\",\r\n validateAdministrator: \"验证管理员账户\",\r\n createAdministrator: \"创建管理员账户\",\r\n administratorUsername: \"管理员用户名\",\r\n administratorPassword: \"管理员密码\",\r\n administratorRePassword: \"再次输入密码\",\r\n usernameRule: \"由于用户名将作为文件上传的目录,因此只允许字母数字以及\\\"_\\\"。\",\r\n congratulationInstall: \"恭喜,安装成功!\",\r\n configAdminFirst: \"请首先配置管理员信息!\",\r\n createAdminSuccess: \"创建管理员成功!\",\r\n validateAdminSuccess: \"验证管理员成功!\",\r\n pressToHome: \"点击下方按钮来完成安装过程并进入首页。\",\r\n enterHome: \"完成,并进入首页\",\r\n finish: \"完成\",\r\n },\r\n layout: {\r\n allFiles: \"全部文件\",\r\n myShare: \"我的分享\",\r\n bin: \"回收站\",\r\n setting: \"网站设置\",\r\n dashboard: \"监控统计\",\r\n users: \"用户管理\",\r\n logout: \"退出登录\",\r\n about: \"关于\",\r\n install: \"安装网站\",\r\n dragMouseUp: \"可以松手啦~\"\r\n },\r\n matter: {\r\n file: \"文件\",\r\n directory: \"文件夹\",\r\n rename: \"重命名\",\r\n download: \"下载\",\r\n delete: \"删除\",\r\n hardDelete: \"彻底删除\",\r\n recovery: \"恢复\",\r\n more: \"更多\",\r\n share: \"分享\",\r\n close: \"关闭\",\r\n size: \"大小\",\r\n preview: \"预览\",\r\n move: \"移动\",\r\n moveTo: \"移动到\",\r\n upload: \"上传\",\r\n create: \"新建\",\r\n createTime: \"创建时间\",\r\n updateTime: \"修改时间\",\r\n deleteTime: \"删除时间\",\r\n root: \"根目录\",\r\n fillInPicLink: \"请填写图片链接\",\r\n rePick: \"重新选择\",\r\n chooseImage: \"选择图片\",\r\n uploadMode: \"上传模式\",\r\n fillMode: \"填写模式\",\r\n sizeExceedLimit: \"文件大小超过了限制{}>{}\",\r\n setPublic: \"设置为公有文件\",\r\n setPrivate: \"设置为私有文件\",\r\n copyLink: \"复制下载链接\",\r\n enterName: \"请输入名称\",\r\n publicFileEveryoneCanVisit: \"公有文件,任何人可以访问\",\r\n fileDetail: \"文件详情\",\r\n expire: \"有效期\",\r\n copyLinkAndCode: \"复制链接+提取码\",\r\n uploaded: \"已上传\",\r\n uploadDir: '上传文件夹',\r\n uploadInfo: '上传信息',\r\n uploadErrorInfo: '部分文件上传失败,可导出csv文件查看',\r\n exportCSV: '导出上传错误详情',\r\n speed: \"速度\",\r\n fileInfo: \"文件基本信息\",\r\n fileName: \"文件名\",\r\n path: \"路径\",\r\n copyPath: \"复制路径\",\r\n publicOrPrivate: \"文件公开性\",\r\n privateInfo: \"私有文件,只有自己或者授权的用户可以下载\",\r\n publicInfo: \"公有文件,任何人可以通过链接下载\",\r\n downloadTimes: \"下载次数\",\r\n operations: \"操作\",\r\n oneTimeLink: \"一次性链接\",\r\n oneTimeLinkInfo: \"使用一次性链接下载后链接立即失效,可以分享这个链接给朋友,点击复制\",\r\n imageCache: \"图片缓存\",\r\n searchFile: \"搜索文件\",\r\n noContentYet: \"该目录下暂无任何内容\",\r\n allFiles: \"全部文件\",\r\n newDirectory: \"新建文件夹\",\r\n notChoose: \"没有选择文件\",\r\n exceed1000: \"最多只能同时选取1000个文件\",\r\n noImageCache: \"暂无图片缓存数据\",\r\n recycleBin: \"回收站\",\r\n deleted: \"已删除\",\r\n unCompatibleBrowser: \"当前浏览器不支持,请切换浏览器尝试\",\r\n canIUse: \"查看当前浏览器是否支持,点击跳转\",\r\n intoRecycleBin: \"放入回收站\",\r\n finishingTip: \"后台文件整理中,请稍候...\"\r\n },\r\n router: {\r\n allFiles: \"全部文件\",\r\n fileDetail: \"文件详情\",\r\n login: \"登录\",\r\n autoLogin: \"自动登录\",\r\n register: \"注册\",\r\n users: \"用户列表\",\r\n userDetail: \"用户详情\",\r\n changePassword: \"修改密码\",\r\n editUser: \"编辑用户\",\r\n createUser: \"创建用户\",\r\n shareDetail: \"分享详情\",\r\n myShare: \"我的分享\",\r\n dashboard: \"监控统计\",\r\n install: \"安装网站\",\r\n setting: \"网站设置\"\r\n },\r\n preference: {\r\n basic: \"基本信息\",\r\n preview: \"预览引擎\",\r\n scan: \"扫描磁盘\",\r\n websiteName: \"网站名称\",\r\n logo: \"Logo\",\r\n logoSquare: \"logo请使用正方形图片,否则在显示时会裁剪成正方形\",\r\n onlyAllowIco: \"只允许上传.ico图标\",\r\n copyright: \"版权信息(支持html)\",\r\n extraInfo: \"备案信息(支持html)\",\r\n zipMaxNumLimit: \"zip下载数量限制\",\r\n zipMaxSizeLimit: \"zip下载大小限制(B)\",\r\n current: \"当前值\",\r\n noLimit: \"无限制\",\r\n userDefaultSizeLimit: \"用户默认总大小限制(B) \",\r\n matterBinDefaultSaveDay: \"回收站默认保留天数\",\r\n enterMatterBinDefaultSaveDay: \"默认回收站默认保留天数必填!\",\r\n docLink: \"文档链接\",\r\n tankDocLink: \"https://tank-doc.eyeblue.cn/zh\",\r\n allowRegister: \"允许自主注册\",\r\n systemCleanup: \"重置系统\",\r\n systemCleanupDescription: \"重置系统将清空除管理员账号外所有数据\",\r\n systemCleanupPrompt: \"重置系统将清空除管理员账号外所有数据,事关重大,请输入登录密码\",\r\n previewConfig: \"文件预览配置\",\r\n editPreference: \"设置网站偏好\",\r\n editPreviewEngine: \"设置预览引擎\",\r\n enterWebsiteName: \"请输入网站名称!\",\r\n enterZipMaxNumLimit: \"zip最大数量限制必填!\",\r\n enterZipMaxSizeLimit: \"zip大小限制必填!\",\r\n enterUserDefaultSizeLimit: \"默认用户空间大小必填!\",\r\n engine: \"{}号预览引擎\",\r\n noEngine: \"暂无在线预览引擎配置\",\r\n newEngine: \"添加一个预览引擎\",\r\n engineReg: \"引擎格式\",\r\n engineSuffix: \"匹配后缀\",\r\n enginePreview: \"预览方式\",\r\n defaultPreview: \"默认引擎\",\r\n previewEngine: \"{}号引擎\",\r\n defaultPreviewDesc: \"默认预览引擎,不可移除\",\r\n engineRegHelper: \"此处填写模板语法,{url}表示文件路径,预览时会自动替换成对应的文件url\",\r\n engineUsageHint: \"对于一个文件的预览,使用第一个匹配到后缀名的引擎,没有配匹到则使用系统默认预览引擎\",\r\n engineRegPlaceHolder: \"例如:https://xxx.xxx.xxx?url={url}\",\r\n engineSuffixPlaceHolder: '输入后缀,使用逗号分隔,不用带. 例如:doc,ppt,xls',\r\n previewCurrent: \"本站预览\",\r\n previewOpen: \"新标签打开\",\r\n editScan: \"设置磁盘扫描\",\r\n enableScan: \"开启磁盘扫描\",\r\n disabledScan: \"暂未开启磁盘扫描\",\r\n scanCron: \"定时扫描\",\r\n cron: \"cron表达式\",\r\n cronValidate: \"cron表达式不能为空\",\r\n scanScope: \"扫描范围\",\r\n scanUsers: \"扫描用户\",\r\n scanPerTenSeconds: \"每十秒\",\r\n scanPerThirtySeconds: \"每三十秒\",\r\n scanPerMinute: \"每分钟\",\r\n scanPerHour: \"每小时\",\r\n scanCustom: \"自定义\",\r\n chooseUsers: \"模糊搜索用户\",\r\n chooseUsersValidate: \"请选择至少一个用户\",\r\n scanLoading: \"扫描中,请稍后...\",\r\n matterBinDefaultTip: \"设置0表示关闭回收站功能\"\r\n },\r\n share: {\r\n shareDetail: \"分享详情\",\r\n shareTime: \"分享时间\",\r\n expireTime: \"失效时间\",\r\n noExpire: \"永久有效\",\r\n expired: \"已过期\",\r\n copyLinkAndCode: \"复制链接+提取码\",\r\n shareSuccess: \"分享成功\",\r\n sharer: \"分享者\",\r\n link: \"链接\",\r\n copyLink: \"复制链接\",\r\n code: \"提取码\",\r\n copyCode: \"复制提取码\",\r\n copySuccess: \"复制成功\",\r\n more: \"更多\",\r\n cancelShare: \"取消分享\",\r\n getLink: \"获取链接\",\r\n allFiles: \"全部文件\",\r\n noContent: \"该目录下暂无任何内容\",\r\n enterCode: \"请输入提取码\",\r\n getFiles: \"提取文件\",\r\n codeError: \"提取码错误\",\r\n cancelPrompt: \"此操作将永久取消该分享, 是否继续?\",\r\n hour: \"1小时\",\r\n day: \"1天\",\r\n week: \"1周\",\r\n month: \"1个月\",\r\n year: \"1年\",\r\n infinity: \"永远有效\",\r\n emptyHint: \"暂无任何分享\",\r\n },\r\n user: {\r\n redirecting: \"正在转跳...\",\r\n oldPassword: \"旧密码\",\r\n newPassword: \"新密码\",\r\n confirmNewPassword: \"确认新密码\",\r\n cannotBeNull: \"不能为空!\",\r\n passwordNotSame: \"两次输入不一致!\",\r\n role: \"角色\",\r\n singleFileSizeLimit: \"单文件限制\",\r\n totalFileSizeLimit: \"空间限制\",\r\n current: \"当前值\",\r\n noLimit: \"无限制\",\r\n totalFileSize: \"已使用空间\",\r\n status: \"状态\",\r\n lastLogin: \"上次登录\",\r\n lastLoginIp: \"上次登录IP\",\r\n lastLoginTime: \"上次登录时间\",\r\n resetPassword: \"重置密码\",\r\n transfiguration: \"变身\",\r\n changePassword: \"修改密码\",\r\n enterPassword: \"输入密码\",\r\n enterUsername: \"请输入用户名\",\r\n enterNewPassword: \"请输入新密码\",\r\n profile: \"个人详情\",\r\n avatar: \"头像\",\r\n username: \"用户名\",\r\n password: \"密码\",\r\n confirmPassword: \"确认密码\",\r\n disabled: \"已禁用\",\r\n disableUser: \"禁用该用户\",\r\n activeUser: \"激活该用户\",\r\n deleteUser: \"删除该用户\",\r\n deleteHint: \"此操作将删除用户【{}】的所有记录,包括文件,分享,用户信息等内容,确定继续?\",\r\n disable: \"禁用\",\r\n sync: \"同步\",\r\n active: \"激活\",\r\n welcomeLogin: \"欢迎登录\",\r\n logining: \"正在登录...\",\r\n login: \"登录\",\r\n loginSuccess: \"登录成功\",\r\n toToRegister: \"立即注册\",\r\n welcomeRegister: \"欢迎注册\",\r\n registering: \"正在登录...\",\r\n register: \"注册\",\r\n goToLogin: \"前往登录\",\r\n roleGuest: \"游客\",\r\n roleUser: \"注册用户\",\r\n roleAdministrator: \"管理员\",\r\n statusActive: \"正常\",\r\n statusDisabled: \"禁用\",\r\n webdavLink: \"WebDAV 地址\",\r\n docLink: \"文档链接\",\r\n createUser: \"创建用户\",\r\n editUser: \"编辑用户\",\r\n editSomebodyPassword: \"修改{}的密码\",\r\n transfigurationPromptText: \"变身提示\",\r\n transfigurationPrompt: \"您将使用该用户的身份登录。请复制以下链接到其他浏览器访问,在当前浏览器访问会导致当前用户登录信息失效。\",\r\n allUsers: \"全部用户\",\r\n partialUsers: \"局部用户\"\r\n },\r\n model: {\r\n usernameRule: \"用户名只能包含字母,数字和\\\"_\\\"\",\r\n passwordRule: \"密码长度至少为6位\",\r\n linkCodeText: \"链接:{} 提取码:{}\",\r\n copyLinkCodeSuccess: \"复制链接提取码成功\",\r\n\r\n },\r\n plugin: {\r\n cannotPreview: \"无法预览\",\r\n emptyHintDefault: \"没有符合条件的项目\",\r\n everyPage: \"每页\",\r\n items: \"条\",\r\n total: \"共\",\r\n clickRefresh: \"点击刷新\",\r\n },\r\n loading: \"加载中\",\r\n selectAll: \"全选\",\r\n edit: \"修改\",\r\n createTime: \"创建时间\",\r\n download: \"下载\",\r\n close: \"关闭\",\r\n required: \"必填\",\r\n cancel: \"取消\",\r\n delete: \"删除\",\r\n deleteDirectly: \"直接删除\",\r\n actionCanNotRevertConfirm: \"此操作不可撤回, 是否继续?\",\r\n actionDeleteConfirm: \"确定删除吗?\",\r\n actionRecoveryConfirm: \"确定恢复吗?\",\r\n prompt: \"提示\",\r\n confirm: \"确定\",\r\n copy: \"复制\",\r\n copySuccess: \"复制成功!\",\r\n copyError: \"复制失败!\",\r\n showMore: \"显示更多\",\r\n username: \"用户名\",\r\n password: \"密码\",\r\n submit: \"提交\",\r\n save: \"保存\",\r\n create: \"创建\",\r\n finish: \"完成\",\r\n operationSuccess: \"操作成功\",\r\n operation: \"操作\",\r\n notFound: \"404 页面找不到\",\r\n login: \"登录\",\r\n logout: \"退出\",\r\n yes: \"是\",\r\n no: \"否\",\r\n all: \"所有\",\r\n refresh: \"刷新\",\r\n inputRequired: \"该项必填\",\r\n\r\n}\r\n\r\nexport default LangZh\r\n","/**\r\n * 全局性的国际化\r\n */\r\nimport BrowserUtil from \"../../util/BrowserUtil\";\r\nimport LangEn from \"./i18n/LangEn\";\r\nimport LangZh from \"./i18n/LangZh\";\r\n\r\n\r\nexport default class Lang {\r\n\r\n //当前使用的语言,默认中文\r\n lang: string = \"zh\"\r\n\r\n //全局的一个store对象\r\n private static singleton: Lang | null = null\r\n\r\n //使用懒加载模式。\r\n static getSingleton(): Lang {\r\n if (Lang.singleton == null) {\r\n Lang.singleton = new Lang();\r\n\r\n //读取默认的语言\r\n let lang = BrowserUtil.browserLang()\r\n let localLang = localStorage.getItem(\"_lang\");\r\n if (localLang === \"zh\" || localLang === \"en\") {\r\n lang = localLang\r\n }\r\n Lang.singleton.lang = lang\r\n console.info(\"current lang: \", lang)\r\n\r\n }\r\n\r\n return Lang.singleton\r\n }\r\n\r\n //快捷获取一种语言对应的文字。\r\n static t(key: string, ...params: any[]): string {\r\n\r\n let json: { [key: string]: any } = LangEn\r\n\r\n let lang = Lang.getSingleton().lang\r\n if (lang == \"zh\") {\r\n json = LangZh\r\n }\r\n\r\n let keyParts: string[] = key.split(\".\")\r\n let jsonBody: any = json\r\n for (let i = 0; i < keyParts.length; i++) {\r\n let part: string = keyParts[i]\r\n jsonBody = jsonBody[part]\r\n if (jsonBody === undefined || jsonBody === null) {\r\n //找不到key对应的内容,直接返回key\r\n return key\r\n }\r\n }\r\n\r\n //到这里已经找到了\r\n if (typeof jsonBody !== \"string\") {\r\n return key\r\n }\r\n\r\n //依次将参数写入进去。\r\n if (params && params.length > 0) {\r\n for (let i = 0; i < params.length; i++) {\r\n let param = params[i]\r\n jsonBody = jsonBody.replace(\"{}\", param)\r\n }\r\n }\r\n\r\n return jsonBody\r\n }\r\n\r\n}\r\n","import ColorSelectionOption from '../base/option/ColorSelectionOption';\r\nimport Color from \"../base/option/Color\";\r\nimport Lang from \"../global/Lang\";\r\n\r\n\r\nenum UserStatus {\r\n OK = 'OK',\r\n DISABLED = 'DISABLED'\r\n}\r\n\r\nlet UserStatuss: UserStatus[] = Object.keys(UserStatus).map(k => k as UserStatus);\r\n\r\nlet UserStatusMap: { [key in keyof typeof UserStatus]: ColorSelectionOption } = {\r\n OK: {\r\n 'name': Lang.t(\"user.statusActive\"),\r\n 'value': 'OK',\r\n 'color': Color.SUCCESS,\r\n },\r\n DISABLED: {\r\n 'name': Lang.t(\"user.statusDisabled\"),\r\n 'value': 'DISABLED',\r\n 'color': Color.DANGER,\r\n },\r\n};\r\n\r\nlet UserStatusList: ColorSelectionOption[] = [];\r\nUserStatuss.forEach((type: UserStatus, index: number) => {\r\n UserStatusList.push(UserStatusMap[type]);\r\n});\r\n\r\n\r\nexport {UserStatus, UserStatuss, UserStatusMap, UserStatusList};\r\n\r\n\r\n\r\n\r\n","export default class NumberUtil {\r\n //求最大公约数\r\n static gcd(a: number, b: number): number {\r\n return b ? NumberUtil.gcd(b, a % b) : a;\r\n }\r\n\r\n //约分 numerator:分子 denominator:分母\r\n static reduce(numerator: number, denominator: number) {\r\n let maxFactor = NumberUtil.gcd(numerator, denominator);\r\n return [numerator / maxFactor, denominator / maxFactor];\r\n }\r\n\r\n static isInteger(obj: any) {\r\n return typeof obj === \"number\" && obj % 1 === 0;\r\n }\r\n\r\n //转换成整型\r\n static parseInt(obj: any): number {\r\n try {\r\n return parseInt(obj);\r\n } catch (e) {\r\n console.error(\"无法转换成整数\", obj);\r\n return 0;\r\n }\r\n }\r\n\r\n //比较两个分数是否相等\r\n static fractionEqual(\r\n numerator1: number,\r\n denominator1: number,\r\n numerator2: number,\r\n denominator2: number\r\n ) {\r\n let fraction1 = NumberUtil.reduce(numerator1, denominator1);\r\n let fraction2 = NumberUtil.reduce(numerator2, denominator2);\r\n\r\n return fraction1[0] === fraction2[0] && fraction1[1] === fraction2[1];\r\n }\r\n}\r\n","export default class MimeUtil {\r\n static MIMES: any = {\r\n \".323\": \"text/h323\",\r\n \".3g2\": \"video/3gpp2\",\r\n \".3gp\": \"video/3gpp\",\r\n \".3gp2\": \"video/3gpp2\",\r\n \".3gpp\": \"video/3gpp\",\r\n \".7z\": \"application/x-7z-compressed\",\r\n \".aa\": \"audio/audible\",\r\n \".AAC\": \"audio/aac\",\r\n \".aaf\": \"application/octet-stream\",\r\n \".aax\": \"audio/vnd.audible.aax\",\r\n \".ac3\": \"audio/ac3\",\r\n \".aca\": \"application/octet-stream\",\r\n \".accda\": \"application/msaccess.addin\",\r\n \".accdb\": \"application/msaccess\",\r\n \".accdc\": \"application/msaccess.cab\",\r\n \".accde\": \"application/msaccess\",\r\n \".accdr\": \"application/msaccess.runtime\",\r\n \".accdt\": \"application/msaccess\",\r\n \".accdw\": \"application/msaccess.webapplication\",\r\n \".accft\": \"application/msaccess.ftemplate\",\r\n \".acx\": \"application/internet-property-stream\",\r\n \".AddIn\": \"text/xml\",\r\n \".ade\": \"application/msaccess\",\r\n \".adobebridge\": \"application/x-bridge-url\",\r\n \".adp\": \"application/msaccess\",\r\n \".ADT\": \"audio/vnd.dlna.adts\",\r\n \".ADTS\": \"audio/aac\",\r\n \".afm\": \"application/octet-stream\",\r\n \".ai\": \"application/postscript\",\r\n \".aif\": \"audio/aiff\",\r\n \".aifc\": \"audio/aiff\",\r\n \".aiff\": \"audio/aiff\",\r\n \".air\": \"application/vnd.adobe.air-application-installer-package+zip\",\r\n \".amc\": \"application/mpeg\",\r\n \".anx\": \"application/annodex\",\r\n \".apk\": \"application/vnd.android.package-archive\",\r\n \".application\": \"application/x-ms-application\",\r\n \".art\": \"image/x-jg\",\r\n \".asa\": \"application/xml\",\r\n \".asax\": \"application/xml\",\r\n \".ascx\": \"application/xml\",\r\n \".asd\": \"application/octet-stream\",\r\n \".asf\": \"video/x-ms-asf\",\r\n \".ashx\": \"application/xml\",\r\n \".asi\": \"application/octet-stream\",\r\n \".asm\": \"text/plain\",\r\n \".asmx\": \"application/xml\",\r\n \".aspx\": \"application/xml\",\r\n \".asr\": \"video/x-ms-asf\",\r\n \".asx\": \"video/x-ms-asf\",\r\n \".atom\": \"application/atom+xml\",\r\n \".au\": \"audio/basic\",\r\n \".avi\": \"video/x-msvideo\",\r\n \".axa\": \"audio/annodex\",\r\n \".axs\": \"application/olescript\",\r\n \".axv\": \"video/annodex\",\r\n \".bas\": \"text/plain\",\r\n \".bat\": \"text/plain\",\r\n \".bcpio\": \"application/x-bcpio\",\r\n \".bin\": \"application/octet-stream\",\r\n \".bmp\": \"image/bmp\",\r\n \".c\": \"text/plain\",\r\n \".cab\": \"application/octet-stream\",\r\n \".caf\": \"audio/x-caf\",\r\n \".calx\": \"application/vnd.ms-office.calx\",\r\n \".cat\": \"application/vnd.ms-pki.seccat\",\r\n \".cc\": \"text/plain\",\r\n \".cd\": \"text/plain\",\r\n \".cdda\": \"audio/aiff\",\r\n \".cdf\": \"application/x-cdf\",\r\n \".cer\": \"application/x-x509-ca-cert\",\r\n \".cfg\": \"text/plain\",\r\n \".chm\": \"application/octet-stream\",\r\n \".class\": \"application/x-java-applet\",\r\n \".clp\": \"application/x-msclip\",\r\n \".cmd\": \"text/plain\",\r\n \".cmx\": \"image/x-cmx\",\r\n \".cnf\": \"text/plain\",\r\n \".cod\": \"image/cis-cod\",\r\n \".config\": \"application/xml\",\r\n \".contact\": \"text/x-ms-contact\",\r\n \".coverage\": \"application/xml\",\r\n \".cpio\": \"application/x-cpio\",\r\n \".cpp\": \"text/plain\",\r\n \".crd\": \"application/x-mscardfile\",\r\n \".crl\": \"application/pkix-crl\",\r\n \".crt\": \"application/x-x509-ca-cert\",\r\n \".cs\": \"text/plain\",\r\n \".csdproj\": \"text/plain\",\r\n \".csh\": \"application/x-csh\",\r\n \".csproj\": \"text/plain\",\r\n \".css\": \"text/css\",\r\n \".csv\": \"application/csv\",\r\n \".cur\": \"application/octet-stream\",\r\n \".cxx\": \"text/plain\",\r\n \".dat\": \"application/octet-stream\",\r\n \".datasource\": \"application/xml\",\r\n \".dbproj\": \"text/plain\",\r\n \".dcr\": \"application/x-director\",\r\n \".def\": \"text/plain\",\r\n \".deploy\": \"application/octet-stream\",\r\n \".der\": \"application/x-x509-ca-cert\",\r\n \".dgml\": \"application/xml\",\r\n \".dib\": \"image/bmp\",\r\n \".dif\": \"video/x-dv\",\r\n \".dir\": \"application/x-director\",\r\n \".disco\": \"text/xml\",\r\n \".divx\": \"video/divx\",\r\n \".dll\": \"application/x-msdownload\",\r\n \".dll.config\": \"text/xml\",\r\n \".dlm\": \"text/dlm\",\r\n \".doc\": \"application/msword\",\r\n \".docm\": \"application/vnd.ms-word.document.macroEnabled.12\",\r\n \".docx\":\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \".dot\": \"application/msword\",\r\n \".dotm\": \"application/vnd.ms-word.template.macroEnabled.12\",\r\n \".dotx\":\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\r\n \".dsp\": \"application/octet-stream\",\r\n \".dsw\": \"text/plain\",\r\n \".dtd\": \"text/xml\",\r\n \".dtsConfig\": \"text/xml\",\r\n \".dv\": \"video/x-dv\",\r\n \".dvi\": \"application/x-dvi\",\r\n \".dwf\": \"drawing/x-dwf\",\r\n \".dwg\": \"application/acad\",\r\n \".dwp\": \"application/octet-stream\",\r\n \".dxf\": \"application/x-dxf\",\r\n \".dxr\": \"application/x-director\",\r\n \".eml\": \"message/rfc822\",\r\n \".emz\": \"application/octet-stream\",\r\n \".eot\": \"application/vnd.ms-fontobject\",\r\n \".eps\": \"application/postscript\",\r\n \".etl\": \"application/etl\",\r\n \".etx\": \"text/x-setext\",\r\n \".evy\": \"application/envoy\",\r\n \".exe\": \"application/octet-stream\",\r\n \".exe.config\": \"text/xml\",\r\n \".fdf\": \"application/vnd.fdf\",\r\n \".fif\": \"application/fractals\",\r\n \".filters\": \"application/xml\",\r\n \".fla\": \"application/octet-stream\",\r\n \".flac\": \"audio/flac\",\r\n \".flr\": \"x-world/x-vrml\",\r\n \".flv\": \"video/x-flv\",\r\n \".fsscript\": \"application/fsharp-script\",\r\n \".fsx\": \"application/fsharp-script\",\r\n \".generictest\": \"application/xml\",\r\n \".gif\": \"image/gif\",\r\n \".gpx\": \"application/gpx+xml\",\r\n \".group\": \"text/x-ms-group\",\r\n \".gradle\": \"text/plain\",\r\n \".gsm\": \"audio/x-gsm\",\r\n \".gtar\": \"application/x-gtar\",\r\n \".gz\": \"application/x-gzip\",\r\n \".h\": \"text/plain\",\r\n \".hdf\": \"application/x-hdf\",\r\n \".hdml\": \"text/x-hdml\",\r\n \".hhc\": \"application/x-oleobject\",\r\n \".hhk\": \"application/octet-stream\",\r\n \".hhp\": \"application/octet-stream\",\r\n \".hlp\": \"application/winhlp\",\r\n \".hpp\": \"text/plain\",\r\n \".hqx\": \"application/mac-binhex40\",\r\n \".hta\": \"application/hta\",\r\n \".htc\": \"text/x-component\",\r\n \".htm\": \"text/html\",\r\n \".html\": \"text/html\",\r\n \".htt\": \"text/webviewhtml\",\r\n \".hxa\": \"application/xml\",\r\n \".hxc\": \"application/xml\",\r\n \".hxd\": \"application/octet-stream\",\r\n \".hxe\": \"application/xml\",\r\n \".hxf\": \"application/xml\",\r\n \".hxh\": \"application/octet-stream\",\r\n \".hxi\": \"application/octet-stream\",\r\n \".hxk\": \"application/xml\",\r\n \".hxq\": \"application/octet-stream\",\r\n \".hxr\": \"application/octet-stream\",\r\n \".hxs\": \"application/octet-stream\",\r\n \".hxt\": \"text/html\",\r\n \".hxv\": \"application/xml\",\r\n \".hxw\": \"application/octet-stream\",\r\n \".hxx\": \"text/plain\",\r\n \".i\": \"text/plain\",\r\n \".ico\": \"image/x-icon\",\r\n \".ics\": \"application/octet-stream\",\r\n \".idl\": \"text/plain\",\r\n \".ief\": \"image/ief\",\r\n \".iii\": \"application/x-iphone\",\r\n \".inc\": \"text/plain\",\r\n \".inf\": \"application/octet-stream\",\r\n \".ini\": \"text/plain\",\r\n \".inl\": \"text/plain\",\r\n \".ins\": \"application/x-internet-signup\",\r\n \".ipa\": \"application/x-itunes-ipa\",\r\n \".ipg\": \"application/x-itunes-ipg\",\r\n \".ipproj\": \"text/plain\",\r\n \".ipsw\": \"application/x-itunes-ipsw\",\r\n \".iqy\": \"text/x-ms-iqy\",\r\n \".isp\": \"application/x-internet-signup\",\r\n \".ite\": \"application/x-itunes-ite\",\r\n \".itlp\": \"application/x-itunes-itlp\",\r\n \".itms\": \"application/x-itunes-itms\",\r\n \".itpc\": \"application/x-itunes-itpc\",\r\n \".IVF\": \"video/x-ivf\",\r\n \".jar\": \"application/java-archive\",\r\n \".java\": \"text/plain\",\r\n \".jck\": \"application/liquidmotion\",\r\n \".jcz\": \"application/liquidmotion\",\r\n \".jfif\": \"image/pjpeg\",\r\n \".jnlp\": \"application/x-java-jnlp-file\",\r\n \".jpb\": \"application/octet-stream\",\r\n \".jpe\": \"image/jpeg\",\r\n \".jpeg\": \"image/jpeg\",\r\n \".jpg\": \"image/jpeg\",\r\n \".js\": \"text/plain\",\r\n \".json\": \"application/json\",\r\n \".jsx\": \"text/jscript\",\r\n \".jsxbin\": \"text/plain\",\r\n \".latex\": \"application/x-latex\",\r\n \".less\": \"text/plain\",\r\n \".library-ms\": \"application/windows-library+xml\",\r\n \".lit\": \"application/x-ms-reader\",\r\n \".loadtest\": \"application/xml\",\r\n \".lpk\": \"application/octet-stream\",\r\n \".lsf\": \"video/x-la-asf\",\r\n \".lst\": \"text/plain\",\r\n \".lsx\": \"video/x-la-asf\",\r\n \".lzh\": \"application/octet-stream\",\r\n \".m13\": \"application/x-msmediaview\",\r\n \".m14\": \"application/x-msmediaview\",\r\n \".m1v\": \"video/mpeg\",\r\n \".m2t\": \"video/vnd.dlna.mpeg-tts\",\r\n \".m2ts\": \"video/vnd.dlna.mpeg-tts\",\r\n \".m2v\": \"video/mpeg\",\r\n \".m3u\": \"audio/x-mpegurl\",\r\n \".m3u8\": \"audio/x-mpegurl\",\r\n \".m4a\": \"audio/m4a\",\r\n \".m4b\": \"audio/m4b\",\r\n \".m4p\": \"audio/m4p\",\r\n \".m4r\": \"audio/x-m4r\",\r\n \".m4v\": \"video/x-m4v\",\r\n \".mac\": \"image/x-macpaint\",\r\n \".mak\": \"text/plain\",\r\n \".man\": \"application/x-troff-man\",\r\n \".manifest\": \"application/x-ms-manifest\",\r\n \".map\": \"text/plain\",\r\n \".master\": \"application/xml\",\r\n \".mbox\": \"application/mbox\",\r\n \".md\": \"text/plain\",\r\n \".mda\": \"application/msaccess\",\r\n \".mdb\": \"application/x-msaccess\",\r\n \".mde\": \"application/msaccess\",\r\n \".mdp\": \"application/octet-stream\",\r\n \".me\": \"application/x-troff-me\",\r\n \".mfp\": \"application/x-shockwave-flash\",\r\n \".mht\": \"message/rfc822\",\r\n \".mhtml\": \"message/rfc822\",\r\n \".mid\": \"audio/mid\",\r\n \".midi\": \"audio/mid\",\r\n \".mix\": \"application/octet-stream\",\r\n \".mk\": \"text/plain\",\r\n \".mmf\": \"application/x-smaf\",\r\n \".mno\": \"text/xml\",\r\n \".mny\": \"application/x-msmoney\",\r\n \".mod\": \"video/mpeg\",\r\n \".mov\": \"video/quicktime\",\r\n \".movie\": \"video/x-sgi-movie\",\r\n \".mp2\": \"video/mpeg\",\r\n \".mp2v\": \"video/mpeg\",\r\n \".mp3\": \"audio/mpeg\",\r\n \".mp4\": \"video/mp4\",\r\n \".mp4v\": \"video/mp4\",\r\n \".mpa\": \"video/mpeg\",\r\n \".mpe\": \"video/mpeg\",\r\n \".mpeg\": \"video/mpeg\",\r\n \".mpf\": \"application/vnd.ms-mediapackage\",\r\n \".mpg\": \"video/mpeg\",\r\n \".mpp\": \"application/vnd.ms-project\",\r\n \".mpv2\": \"video/mpeg\",\r\n \".mqv\": \"video/quicktime\",\r\n \".ms\": \"application/x-troff-ms\",\r\n \".msg\": \"application/vnd.ms-outlook\",\r\n \".msi\": \"application/octet-stream\",\r\n \".mso\": \"application/octet-stream\",\r\n \".mts\": \"video/vnd.dlna.mpeg-tts\",\r\n \".mtx\": \"application/xml\",\r\n \".mvb\": \"application/x-msmediaview\",\r\n \".mvc\": \"application/x-miva-compiled\",\r\n \".mxp\": \"application/x-mmxp\",\r\n \".nc\": \"application/x-netcdf\",\r\n \".nsc\": \"video/x-ms-asf\",\r\n \".nws\": \"message/rfc822\",\r\n \".ocx\": \"application/octet-stream\",\r\n \".oda\": \"application/oda\",\r\n \".odb\": \"application/vnd.oasis.opendocument.database\",\r\n \".odc\": \"application/vnd.oasis.opendocument.chart\",\r\n \".odf\": \"application/vnd.oasis.opendocument.formula\",\r\n \".odg\": \"application/vnd.oasis.opendocument.graphics\",\r\n \".odh\": \"text/plain\",\r\n \".odi\": \"application/vnd.oasis.opendocument.image\",\r\n \".odl\": \"text/plain\",\r\n \".odm\": \"application/vnd.oasis.opendocument.text-master\",\r\n \".odp\": \"application/vnd.oasis.opendocument.presentation\",\r\n \".ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\r\n \".odt\": \"application/vnd.oasis.opendocument.text\",\r\n \".oga\": \"audio/ogg\",\r\n \".ogg\": \"audio/ogg\",\r\n \".ogv\": \"video/ogg\",\r\n \".ogx\": \"application/ogg\",\r\n \".one\": \"application/onenote\",\r\n \".onea\": \"application/onenote\",\r\n \".onepkg\": \"application/onenote\",\r\n \".onetmp\": \"application/onenote\",\r\n \".onetoc\": \"application/onenote\",\r\n \".onetoc2\": \"application/onenote\",\r\n \".opus\": \"audio/ogg\",\r\n \".orderedtest\": \"application/xml\",\r\n \".osdx\": \"application/opensearchdescription+xml\",\r\n \".otf\": \"application/font-sfnt\",\r\n \".otg\": \"application/vnd.oasis.opendocument.graphics-template\",\r\n \".oth\": \"application/vnd.oasis.opendocument.text-web\",\r\n \".otp\": \"application/vnd.oasis.opendocument.presentation-template\",\r\n \".ots\": \"application/vnd.oasis.opendocument.spreadsheet-template\",\r\n \".ott\": \"application/vnd.oasis.opendocument.text-template\",\r\n \".oxt\": \"application/vnd.openofficeorg.extension\",\r\n \".p10\": \"application/pkcs10\",\r\n \".p12\": \"application/x-pkcs12\",\r\n \".p7b\": \"application/x-pkcs7-certificates\",\r\n \".p7c\": \"application/pkcs7-mime\",\r\n \".p7m\": \"application/pkcs7-mime\",\r\n \".p7r\": \"application/x-pkcs7-certreqresp\",\r\n \".p7s\": \"application/pkcs7-signature\",\r\n \".pbm\": \"image/x-portable-bitmap\",\r\n \".pcast\": \"application/x-podcast\",\r\n \".pct\": \"image/pict\",\r\n \".pcx\": \"application/octet-stream\",\r\n \".pcz\": \"application/octet-stream\",\r\n \".pdf\": \"application/pdf\",\r\n \".pfb\": \"application/octet-stream\",\r\n \".pfm\": \"application/octet-stream\",\r\n \".pfx\": \"application/x-pkcs12\",\r\n \".pgm\": \"image/x-portable-graymap\",\r\n \".pic\": \"image/pict\",\r\n \".pict\": \"image/pict\",\r\n \".pkgdef\": \"text/plain\",\r\n \".pkgundef\": \"text/plain\",\r\n \".pko\": \"application/vnd.ms-pki.pko\",\r\n \".pls\": \"audio/scpls\",\r\n \".pma\": \"application/x-perfmon\",\r\n \".pmc\": \"application/x-perfmon\",\r\n \".pml\": \"application/x-perfmon\",\r\n \".pmr\": \"application/x-perfmon\",\r\n \".pmw\": \"application/x-perfmon\",\r\n \".png\": \"image/png\",\r\n \".pnm\": \"image/x-portable-anymap\",\r\n \".pnt\": \"image/x-macpaint\",\r\n \".pntg\": \"image/x-macpaint\",\r\n \".pnz\": \"image/png\",\r\n \".pot\": \"application/vnd.ms-powerpoint\",\r\n \".potm\": \"application/vnd.ms-powerpoint.template.macroEnabled.12\",\r\n \".potx\":\r\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\r\n \".ppa\": \"application/vnd.ms-powerpoint\",\r\n \".ppam\": \"application/vnd.ms-powerpoint.addin.macroEnabled.12\",\r\n \".ppm\": \"image/x-portable-pixmap\",\r\n \".pps\": \"application/vnd.ms-powerpoint\",\r\n \".ppsm\": \"application/vnd.ms-powerpoint.slideshow.macroEnabled.12\",\r\n \".ppsx\":\r\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\r\n \".ppt\": \"application/vnd.ms-powerpoint\",\r\n \".pptm\": \"application/vnd.ms-powerpoint.presentation.macroEnabled.12\",\r\n \".pptx\":\r\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n \".prf\": \"application/pics-rules\",\r\n \".prm\": \"application/octet-stream\",\r\n \".prx\": \"application/octet-stream\",\r\n \".ps\": \"application/postscript\",\r\n \".psc1\": \"application/PowerShell\",\r\n \".psd\": \"application/octet-stream\",\r\n \".psess\": \"application/xml\",\r\n \".psm\": \"application/octet-stream\",\r\n \".psp\": \"application/octet-stream\",\r\n \".pst\": \"application/vnd.ms-outlook\",\r\n \".pub\": \"application/x-mspublisher\",\r\n \".py\": \"text/plain\",\r\n \".pwz\": \"application/vnd.ms-powerpoint\",\r\n \".qht\": \"text/x-html-insertion\",\r\n \".qhtm\": \"text/x-html-insertion\",\r\n \".qt\": \"video/quicktime\",\r\n \".qti\": \"image/x-quicktime\",\r\n \".qtif\": \"image/x-quicktime\",\r\n \".qtl\": \"application/x-quicktimeplayer\",\r\n \".qxd\": \"application/octet-stream\",\r\n \".ra\": \"audio/x-pn-realaudio\",\r\n \".ram\": \"audio/x-pn-realaudio\",\r\n \".rar\": \"application/x-rar-compressed\",\r\n \".ras\": \"image/x-cmu-raster\",\r\n \".rat\": \"application/rat-file\",\r\n \".rc\": \"text/plain\",\r\n \".rc2\": \"text/plain\",\r\n \".rct\": \"text/plain\",\r\n \".rdlc\": \"application/xml\",\r\n \".reg\": \"text/plain\",\r\n \".resx\": \"application/xml\",\r\n \".rf\": \"image/vnd.rn-realflash\",\r\n \".rgb\": \"image/x-rgb\",\r\n \".rgs\": \"text/plain\",\r\n \".rm\": \"application/vnd.rn-realmedia\",\r\n \".rmi\": \"audio/mid\",\r\n \".rmp\": \"application/vnd.rn-rn_music_package\",\r\n \".roff\": \"application/x-troff\",\r\n \".rpm\": \"audio/x-pn-realaudio-plugin\",\r\n \".rqy\": \"text/x-ms-rqy\",\r\n \".rtf\": \"application/rtf\",\r\n \".rtx\": \"text/richtext\",\r\n \".rvt\": \"application/octet-stream\",\r\n \".ruleset\": \"application/xml\",\r\n \".s\": \"text/plain\",\r\n \".safariextz\": \"application/x-safari-safariextz\",\r\n \".scd\": \"application/x-msschedule\",\r\n \".scr\": \"text/plain\",\r\n \".sct\": \"text/scriptlet\",\r\n \".sd2\": \"audio/x-sd2\",\r\n \".sdp\": \"application/sdp\",\r\n \".sea\": \"application/octet-stream\",\r\n \".searchConnector-ms\": \"application/windows-search-connector+xml\",\r\n \".setpay\": \"application/set-payment-initiation\",\r\n \".setreg\": \"application/set-registration-initiation\",\r\n \".settings\": \"application/xml\",\r\n \".sgimb\": \"application/x-sgimb\",\r\n \".sgml\": \"text/sgml\",\r\n \".sh\": \"text/plain\",\r\n \".shar\": \"application/x-shar\",\r\n \".shtml\": \"text/html\",\r\n \".sit\": \"application/x-stuffit\",\r\n \".sitemap\": \"application/xml\",\r\n \".skin\": \"application/xml\",\r\n \".skp\": \"application/x-koan\",\r\n \".sldm\": \"application/vnd.ms-powerpoint.slide.macroEnabled.12\",\r\n \".sldx\":\r\n \"application/vnd.openxmlformats-officedocument.presentationml.slide\",\r\n \".slk\": \"application/vnd.ms-excel\",\r\n \".sln\": \"text/plain\",\r\n \".slupkg-ms\": \"application/x-ms-license\",\r\n \".smd\": \"audio/x-smd\",\r\n \".smi\": \"application/octet-stream\",\r\n \".smx\": \"audio/x-smd\",\r\n \".smz\": \"audio/x-smd\",\r\n \".snd\": \"audio/basic\",\r\n \".snippet\": \"application/xml\",\r\n \".snp\": \"application/octet-stream\",\r\n \".sol\": \"text/plain\",\r\n \".sor\": \"text/plain\",\r\n \".spc\": \"application/x-pkcs7-certificates\",\r\n \".spl\": \"application/futuresplash\",\r\n \".spx\": \"audio/ogg\",\r\n \".sql\": \"text/plain\",\r\n \".src\": \"application/x-wais-source\",\r\n \".srf\": \"text/plain\",\r\n \".SSISDeploymentManifest\": \"text/xml\",\r\n \".ssm\": \"application/streamingmedia\",\r\n \".sst\": \"application/vnd.ms-pki.certstore\",\r\n \".stl\": \"application/vnd.ms-pki.stl\",\r\n \".sv4cpio\": \"application/x-sv4cpio\",\r\n \".sv4crc\": \"application/x-sv4crc\",\r\n \".svc\": \"application/xml\",\r\n \".svg\": \"image/svg+xml\",\r\n \".swf\": \"application/x-shockwave-flash\",\r\n \".step\": \"application/step\",\r\n \".stp\": \"application/step\",\r\n \".t\": \"application/x-troff\",\r\n \".tar\": \"application/x-tar\",\r\n \".tcl\": \"application/x-tcl\",\r\n \".testrunconfig\": \"application/xml\",\r\n \".testsettings\": \"application/xml\",\r\n \".tex\": \"application/x-tex\",\r\n \".texi\": \"application/x-texinfo\",\r\n \".texinfo\": \"application/x-texinfo\",\r\n \".tgz\": \"application/x-compressed\",\r\n \".thmx\": \"application/vnd.ms-officetheme\",\r\n \".thn\": \"application/octet-stream\",\r\n \".tif\": \"image/tiff\",\r\n \".tiff\": \"image/tiff\",\r\n \".tlh\": \"text/plain\",\r\n \".tli\": \"text/plain\",\r\n \".toc\": \"application/octet-stream\",\r\n \".tr\": \"application/x-troff\",\r\n \".trm\": \"application/x-msterminal\",\r\n \".trx\": \"application/xml\",\r\n \".ts\": \"video/vnd.dlna.mpeg-tts\",\r\n \".tsv\": \"text/tab-separated-values\",\r\n \".ttf\": \"application/font-sfnt\",\r\n \".tts\": \"video/vnd.dlna.mpeg-tts\",\r\n \".txt\": \"text/plain\",\r\n \".u32\": \"application/octet-stream\",\r\n \".uls\": \"text/iuls\",\r\n \".user\": \"text/plain\",\r\n \".ustar\": \"application/x-ustar\",\r\n \".vb\": \"text/plain\",\r\n \".vbdproj\": \"text/plain\",\r\n \".vbk\": \"video/mpeg\",\r\n \".vbproj\": \"text/plain\",\r\n \".vbs\": \"text/vbscript\",\r\n \".vcf\": \"text/x-vcard\",\r\n \".vcproj\": \"application/xml\",\r\n \".vcs\": \"text/plain\",\r\n \".vcxproj\": \"application/xml\",\r\n \".vddproj\": \"text/plain\",\r\n \".vdp\": \"text/plain\",\r\n \".vdproj\": \"text/plain\",\r\n \".vdx\": \"application/vnd.ms-visio.viewer\",\r\n \".vml\": \"text/xml\",\r\n \".vscontent\": \"application/xml\",\r\n \".vsct\": \"text/xml\",\r\n \".vsd\": \"application/vnd.visio\",\r\n \".vsi\": \"application/ms-vsi\",\r\n \".vsix\": \"application/vsix\",\r\n \".vsixlangpack\": \"text/xml\",\r\n \".vsixmanifest\": \"text/xml\",\r\n \".vsmdi\": \"application/xml\",\r\n \".vspscc\": \"text/plain\",\r\n \".vss\": \"application/vnd.visio\",\r\n \".vsscc\": \"text/plain\",\r\n \".vssettings\": \"text/xml\",\r\n \".vssscc\": \"text/plain\",\r\n \".vst\": \"application/vnd.visio\",\r\n \".vstemplate\": \"text/xml\",\r\n \".vsto\": \"application/x-ms-vsto\",\r\n \".vsw\": \"application/vnd.visio\",\r\n \".vsx\": \"application/vnd.visio\",\r\n \".vtx\": \"application/vnd.visio\",\r\n \".wav\": \"audio/wav\",\r\n \".wave\": \"audio/wav\",\r\n \".wax\": \"audio/x-ms-wax\",\r\n \".wbk\": \"application/msword\",\r\n \".wbmp\": \"image/vnd.wap.wbmp\",\r\n \".wcm\": \"application/vnd.ms-works\",\r\n \".wdb\": \"application/vnd.ms-works\",\r\n \".wdp\": \"image/vnd.ms-photo\",\r\n \".webarchive\": \"application/x-safari-webarchive\",\r\n \".webm\": \"video/webm\",\r\n \".webp\": \"image/webp\" /* https\"://en.wikipedia.org/wiki/WebP */,\r\n \".webtest\": \"application/xml\",\r\n \".wiq\": \"application/xml\",\r\n \".wiz\": \"application/msword\",\r\n \".wks\": \"application/vnd.ms-works\",\r\n \".WLMP\": \"application/wlmoviemaker\",\r\n \".wlpginstall\": \"application/x-wlpg-detect\",\r\n \".wlpginstall3\": \"application/x-wlpg3-detect\",\r\n \".wm\": \"video/x-ms-wm\",\r\n \".wma\": \"audio/x-ms-wma\",\r\n \".wmd\": \"application/x-ms-wmd\",\r\n \".wmf\": \"application/x-msmetafile\",\r\n \".wml\": \"text/vnd.wap.wml\",\r\n \".wmlc\": \"application/vnd.wap.wmlc\",\r\n \".wmls\": \"text/vnd.wap.wmlscript\",\r\n \".wmlsc\": \"application/vnd.wap.wmlscriptc\",\r\n \".wmp\": \"video/x-ms-wmp\",\r\n \".wmv\": \"video/x-ms-wmv\",\r\n \".wmx\": \"video/x-ms-wmx\",\r\n \".wmz\": \"application/x-ms-wmz\",\r\n \".woff\": \"application/font-woff\",\r\n \".wpl\": \"application/vnd.ms-wpl\",\r\n \".wps\": \"application/vnd.ms-works\",\r\n \".wri\": \"application/x-mswrite\",\r\n \".wrl\": \"x-world/x-vrml\",\r\n \".wrz\": \"x-world/x-vrml\",\r\n \".wsc\": \"text/scriptlet\",\r\n \".wsdl\": \"text/xml\",\r\n \".wvx\": \"video/x-ms-wvx\",\r\n \".x\": \"application/directx\",\r\n \".xaf\": \"x-world/x-vrml\",\r\n \".xaml\": \"application/xaml+xml\",\r\n \".xap\": \"application/x-silverlight-app\",\r\n \".xbap\": \"application/x-ms-xbap\",\r\n \".xbm\": \"image/x-xbitmap\",\r\n \".xdr\": \"text/plain\",\r\n \".xht\": \"application/xhtml+xml\",\r\n \".xhtml\": \"application/xhtml+xml\",\r\n \".xla\": \"application/vnd.ms-excel\",\r\n \".xlam\": \"application/vnd.ms-excel.addin.macroEnabled.12\",\r\n \".xlc\": \"application/vnd.ms-excel\",\r\n \".xld\": \"application/vnd.ms-excel\",\r\n \".xlk\": \"application/vnd.ms-excel\",\r\n \".xll\": \"application/vnd.ms-excel\",\r\n \".xlm\": \"application/vnd.ms-excel\",\r\n \".xls\": \"application/vnd.ms-excel\",\r\n \".xlsb\": \"application/vnd.ms-excel.sheet.binary.macroEnabled.12\",\r\n \".xlsm\": \"application/vnd.ms-excel.sheet.macroEnabled.12\",\r\n \".xlsx\":\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n \".xlt\": \"application/vnd.ms-excel\",\r\n \".xltm\": \"application/vnd.ms-excel.template.macroEnabled.12\",\r\n \".xltx\":\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\r\n \".xlw\": \"application/vnd.ms-excel\",\r\n \".xml\": \"text/xml\",\r\n \".xmp\": \"application/octet-stream\",\r\n \".xmta\": \"application/xml\",\r\n \".xof\": \"x-world/x-vrml\",\r\n \".XOML\": \"text/plain\",\r\n \".xpm\": \"image/x-xpixmap\",\r\n \".xps\": \"application/vnd.ms-xpsdocument\",\r\n \".xrm-ms\": \"text/xml\",\r\n \".xsc\": \"application/xml\",\r\n \".xsd\": \"text/xml\",\r\n \".xsf\": \"text/xml\",\r\n \".xsl\": \"text/xml\",\r\n \".xslt\": \"text/xml\",\r\n \".xsn\": \"application/octet-stream\",\r\n \".xss\": \"application/xml\",\r\n \".xspf\": \"application/xspf+xml\",\r\n \".xtp\": \"application/octet-stream\",\r\n \".xwd\": \"image/x-xwindowdump\",\r\n \".z\": \"application/x-compress\",\r\n \".zip\": \"application/zip\",\r\n };\r\n\r\n //根据一个文件名,获取其后缀名(一律使用小写,带.),如果没有后缀名,那么返回\"\"\r\n static getExtension(filename: string | null) {\r\n if (filename == null) {\r\n return \"\";\r\n }\r\n let dotIndex = filename.lastIndexOf(\".\");\r\n if (dotIndex === -1) {\r\n return \"\";\r\n } else {\r\n return filename.substring(dotIndex).toLowerCase();\r\n }\r\n }\r\n\r\n //根据一个文件名,获取其后缀名(一律使用小写,不带.),如果没有后缀名,那么返回\"\"\r\n static getExtensionWithoutDot(filename: string | null) {\r\n if (filename == null) {\r\n return \"\";\r\n }\r\n let dotIndex = filename.lastIndexOf(\".\");\r\n if (dotIndex === -1) {\r\n return \"\";\r\n } else {\r\n return filename.substring(dotIndex + 1).toLowerCase();\r\n }\r\n }\r\n\r\n //根据一个文件名(带后缀的),获取对应的文件类型。\r\n static getMimeType(filename: string | null) {\r\n let extension = MimeUtil.getExtension(filename);\r\n if (MimeUtil.MIMES[extension]) {\r\n return MimeUtil.MIMES[extension];\r\n } else {\r\n return \"application/octet-stream\";\r\n }\r\n }\r\n}\r\n","//应用的占位图片,到处都要用到。 生成网址:http://png-pixel.com/\r\n//rgb(240,240,240)\r\nimport NumberUtil from \"./NumberUtil\";\r\nimport MimeUtil from \"./MimeUtil\";\r\n\r\nexport default class ImageUtil {\r\n static IMAGE_PLACEHOLDER_10_10 =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAEUlEQVR42mP88J8BAzAOZUEAoc4TYb5Mv7IAAAAASUVORK5CYII=\";\r\n static IMAGE_PLACEHOLDER_20_7 =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAQAAACiwqWzAAAAEklEQVR42mP88J+BKMA4IhUCAJ1VDZFobOQaAAAAAElFTkSuQmCC\";\r\n static IMAGE_PLACEHOLDER_4_3 =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAAEElEQVR42mP88J8BDBgxGABf8QXRk11CBwAAAABJRU5ErkJggg==\";\r\n static IMAGE_PLACEHOLDER_16_9 =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAQAAACRI2S5AAAAEklEQVR42mP88J8BL2AcVQAGACSgEXHKPyH/AAAAAElFTkSuQmCC\";\r\n static IMAGE_PLACEHOLDER_2_1 =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAQAAAAeXLZtAAAAE0lEQVR42mP88J+BKMA4qpC+CgH2ThNhpeSxLAAAAABJRU5ErkJggg==\";\r\n\r\n /**\r\n * 统一处理图片url。\r\n * @param url 原图片路径\r\n * @param origin 是否使用原图,一般在查看图片详情的时候使用\r\n * @param width 如果origin=false 裁剪的宽度\r\n * @param height 如果origin=false 裁剪的高度\r\n * @returns\r\n */\r\n static handleImageUrl(\r\n url: string | null = null,\r\n origin: boolean = false,\r\n width: number = 200,\r\n height: number = 200\r\n ) {\r\n if (url) {\r\n if (origin) {\r\n return url;\r\n } else {\r\n //目前支持这几种格式的处理。 jpg jpeg png tif tiff bmp gif\r\n let supportExtensions = [\r\n \".jpg\",\r\n \".jpeg\",\r\n \".png\",\r\n \".tif\",\r\n \".tiff\",\r\n \".bmp\",\r\n \".gif\",\r\n ];\r\n let extension = MimeUtil.getExtension(url);\r\n if (supportExtensions.indexOf(extension) === -1) {\r\n return url;\r\n } else {\r\n return url + \"?ir=fill_\" + width + \"_\" + height;\r\n }\r\n }\r\n } else {\r\n if (NumberUtil.fractionEqual(1, 1, width, height)) {\r\n return ImageUtil.IMAGE_PLACEHOLDER_10_10;\r\n } else if (NumberUtil.fractionEqual(20, 7, width, height)) {\r\n return ImageUtil.IMAGE_PLACEHOLDER_20_7;\r\n } else if (NumberUtil.fractionEqual(4, 3, width, height)) {\r\n return ImageUtil.IMAGE_PLACEHOLDER_4_3;\r\n } else if (NumberUtil.fractionEqual(16, 9, width, height)) {\r\n return ImageUtil.IMAGE_PLACEHOLDER_16_9;\r\n } else if (NumberUtil.fractionEqual(2, 1, width, height)) {\r\n return ImageUtil.IMAGE_PLACEHOLDER_2_1;\r\n } else {\r\n return ImageUtil.IMAGE_PLACEHOLDER_10_10;\r\n }\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * 过滤器中的选择样式\r\n */\r\nenum SelectionFilterType {\r\n //下拉框的样式\r\n COMBOBOX = \"COMBOBOX\",\r\n //按钮的样式\r\n BUTTON = \"BUTTON\",\r\n}\r\n\r\nexport default SelectionFilterType\r\n","import Filter from \"./Filter\";\r\n\r\n/**\r\n * 文本输入框筛选器\r\n * 这种一般是模糊搜索。\r\n */\r\nexport default class InputFilter extends Filter {\r\n\r\n //值,最终填写的内容\r\n value: string = \"\"\r\n\r\n //占位符\r\n placeholder: string\r\n\r\n constructor(name: string, code: string, placeholder?: string | null, visible?: boolean) {\r\n super(name, code, visible)\r\n\r\n if (placeholder) {\r\n this.placeholder = placeholder\r\n } else {\r\n this.placeholder = name\r\n }\r\n }\r\n\r\n\r\n //获取值字符串\r\n getValueString(): string {\r\n return this.value\r\n }\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: string) {\r\n\r\n this.value = value\r\n\r\n }\r\n\r\n\r\n reset() {\r\n this.value = \"\"\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.value === \"\";\r\n }\r\n\r\n}\r\n","import Filter from \"./Filter\";\r\nimport SelectionOption from \"../option/SelectionOption\";\r\nimport SelectionFilterType from \"./SelectionFilterType\";\r\n\r\n\r\n/**\r\n *\r\n * 单项选择过滤器\r\n *\r\n */\r\nexport default class SelectionFilter extends Filter {\r\n\r\n //候选项,要求必须有name和value。\r\n options: SelectionOption[]\r\n\r\n //值,最终填写的内容。null表示这个值不设置\r\n value: string = \"\"\r\n\r\n //采用的样式\r\n selectionType: SelectionFilterType\r\n\r\n constructor(name: string, code: string, options: SelectionOption[],selectionType?: SelectionFilterType, visible?: boolean) {\r\n super(name, code, visible)\r\n\r\n this.options = options\r\n if (selectionType === undefined) {\r\n this.selectionType = SelectionFilterType.COMBOBOX\r\n } else {\r\n this.selectionType = selectionType\r\n }\r\n }\r\n\r\n //获取值字符串\r\n getValueString(): string {\r\n return this.value\r\n }\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: string) {\r\n\r\n if (value === \"\") {\r\n this.value = \"\"\r\n } else {\r\n\r\n //必须是options中的值才接纳。\r\n for (let j = 0; j < this.options.length; j++) {\r\n let opt = this.options[j]\r\n if (opt.value === value) {\r\n this.value = value\r\n return\r\n }\r\n }\r\n\r\n this.value = \"\"\r\n }\r\n\r\n }\r\n\r\n\r\n reset() {\r\n this.value = \"\"\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.value === \"\";\r\n }\r\n\r\n}\r\n","import SafeUtil from '../../util/SafeUtil';\r\nimport BaseEntity from '../base/BaseEntity';\r\nimport {UserRole} from './UserRole';\r\nimport {UserStatus, UserStatusList} from \"./UserStatus\";\r\nimport ImageUtil from \"../../util/ImageUtil\";\r\nimport defaultAvatarPath from \"../../../assets/image/avatar.png\";\r\nimport Filter from \"../base/filter/Filter\";\r\nimport SortFilter from \"../base/filter/SortFilter\";\r\nimport InputFilter from '../base/filter/InputFilter';\r\nimport SelectionFilter from \"../base/filter/SelectionFilter\";\r\n\r\nexport default class User extends BaseEntity {\r\n\r\n //获取当前登录者的信息\r\n static URL_INFO = '/api/user/info';\r\n static URL_LOGIN = '/api/user/login'\r\n static URL_AUTHENTICATION_LOGIN = '/api/user/authentication/login'\r\n static URL_REGISTER = '/api/user/register'\r\n static URL_LOGOUT = '/api/user/logout'\r\n static URL_USER_CHANGE_PASSWORD = '/api/user/change/password'\r\n static URL_USER_RESET_PASSWORD = '/api/user/reset/password'\r\n static URL_USER_TOGGLE_STATUS = '/api/user/toggle/status'\r\n static URL_USER_TRANSFIGURATION = '/api/user/transfiguration'\r\n static URL_USER_SCAN = '/api/user/scan'\r\n\r\n role: UserRole = UserRole.GUEST\r\n username: string | null = null\r\n password: string | null = null\r\n avatarUrl: string | null = null\r\n lastIp: string | null = null\r\n lastTime: Date = new Date()\r\n //默认大小限制100Mb.\r\n sizeLimit: number = 104857600\r\n totalSize: number = 0\r\n totalSizeLimit: number = -1\r\n status: UserStatus = UserStatus.OK\r\n\r\n\r\n constructor(reactComponent?: React.Component) {\r\n\r\n super(reactComponent);\r\n\r\n }\r\n\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n\r\n this.assignEntity(\"lastTime\", Date)\r\n\r\n }\r\n\r\n\r\n getFilters(): Filter[] {\r\n return [\r\n ...super.getFilters(),\r\n new SortFilter(\"按上次登录时间排序\", \"orderLastTime\"),\r\n new InputFilter(\"用户名\", \"username\", \"按用户名搜索\"),\r\n new SelectionFilter(\"状态\", \"status\", UserStatusList),\r\n\r\n ]\r\n }\r\n\r\n getForm(): any {\r\n return {\r\n username: this.username,\r\n password: this.password,\r\n role: this.role,\r\n avatarUrl: this.avatarUrl,\r\n sizeLimit: this.sizeLimit,\r\n totalSizeLimit: this.totalSizeLimit,\r\n uuid: this.uuid ? this.uuid : null\r\n };\r\n }\r\n\r\n\r\n getAvatarUrl(origin: boolean = false) {\r\n if (this.avatarUrl) {\r\n return ImageUtil.handleImageUrl(this.avatarUrl, origin)\r\n } else {\r\n return defaultAvatarPath\r\n }\r\n }\r\n\r\n //登录\r\n httpLogin(username: string, password: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n\r\n let that = this;\r\n\r\n let form = {\r\n username,\r\n password,\r\n };\r\n\r\n this.httpGet(User.URL_LOGIN, form, function (response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback);\r\n\r\n }\r\n\r\n //注册\r\n httpRegister(username: string, password: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n\r\n let that = this;\r\n\r\n let form = {\r\n username,\r\n password,\r\n };\r\n\r\n this.httpGet(User.URL_REGISTER, form, function (response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback);\r\n\r\n }\r\n\r\n //获取当前登录者的信息\r\n httpInfo(loginRequired: boolean, finalCallback?: any) {\r\n\r\n let that = this;\r\n if(loginRequired) { // httpGet有统一的登录处理机制\r\n this.httpGet(User.URL_INFO, {}, function (response: any) {\r\n that.assign(response.data.data);\r\n }, null, finalCallback);\r\n } else {\r\n this.httpPureGet(User.URL_INFO, {}, function (response: any) {\r\n that.assign(response.data.data);\r\n }, () => {}, finalCallback);\r\n }\r\n }\r\n\r\n\r\n //退出登录\r\n httpLogout(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n\r\n let that = this;\r\n\r\n let form = {};\r\n\r\n this.httpGet(User.URL_LOGOUT, form, function (response: any) {\r\n\r\n console.info('退出成功!');\r\n\r\n that.assign(new User())\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback);\r\n\r\n }\r\n\r\n\r\n httpChangePassword(oldPassword: string, newPassword: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n this.httpPost(User.URL_USER_CHANGE_PASSWORD, {\r\n 'oldPassword': oldPassword,\r\n 'newPassword': newPassword\r\n }, function (response: any) {\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n\r\n }, errorCallback)\r\n }\r\n\r\n httpResetPassword(password: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n this.httpPost(User.URL_USER_RESET_PASSWORD, {\r\n 'userUuid': this.uuid,\r\n 'password': password\r\n }, function (response: any) {\r\n\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n\r\n }, errorCallback)\r\n }\r\n\r\n\r\n httpToggleStatus(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n this.httpPost(User.URL_USER_TOGGLE_STATUS, {'uuid': this.uuid}, function (response: any) {\r\n\r\n that.assign(response.data.data);\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n\r\n }, errorCallback)\r\n }\r\n\r\n httpAuthenticationLogin(authentication: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n let form = {authentication}\r\n this.httpPost(User.URL_AUTHENTICATION_LOGIN, form, function (response: any) {\r\n\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n\r\n }, errorCallback)\r\n }\r\n\r\n httpTransfiguration(successCallback: (text: string) => void, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n let form = {'uuid': this.uuid}\r\n this.httpPost(User.URL_USER_TRANSFIGURATION, form, function (response: any) {\r\n\r\n successCallback(response.data.msg)\r\n\r\n }, errorCallback)\r\n }\r\n\r\n\r\n httpScan(successCallback: (text: string) => void, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n let form = {'uuid': this.uuid}\r\n this.httpPost(User.URL_USER_SCAN, form, function (response: any) {\r\n\r\n successCallback(response.data.msg)\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import SelectionOption from \"../../base/option/SelectionOption\";\r\nimport Lang from \"../../global/Lang\";\r\n\r\nenum ScanScopeType {\r\n ALL = \"ALL\",\r\n CUSTOM = \"CUSTOM\",\r\n}\r\n\r\nconst ScanScopeTypes: ScanScopeType[] = Object.keys(ScanScopeType).map(\r\n (k) => k as ScanScopeType\r\n);\r\n\r\nconst ScanScopeTypeMap: { [key in keyof typeof ScanScopeType]: SelectionOption } = {\r\n ALL: {\r\n name: Lang.t(\"user.allUsers\"),\r\n value: \"ALL\",\r\n },\r\n CUSTOM: {\r\n name: Lang.t(\"user.partialUsers\"),\r\n value: \"CUSTOM\",\r\n },\r\n};\r\n\r\nlet ScanScopeTypeList: SelectionOption[] = [];\r\nScanScopeTypes.forEach((type: ScanScopeType) => {\r\n ScanScopeTypeList.push(ScanScopeTypeMap[type]);\r\n});\r\n\r\nexport { ScanScopeType, ScanScopeTypeMap, ScanScopeTypeList };\r\n","/**\n * 预览配置\n * 支持自定义不同的文件预览类型\n */\nimport Base from \"../../base/Base\";\nimport MimeUtil from \"../../../util/MimeUtil\";\n\nexport default class PreviewEngine extends Base {\n /**\n * 此预览引擎的url\n * {originUrl} 文件原始的url地址。eg: https://tank.eyeblue.cn/api/alien/download/2a0ceee1-744c-4c82-4215-69c382597a50/abstract-free-photo-2210x1473.jpg\n * {url} 对于公有文件publicUrl=originUrl,对于私有文件publicUrl是originUrl带上downloadToken。 eg: https://tank.eyeblue.cn/api/alien/download/2a0ceee1-744c-4c82-4215-69c382597a50/abstract-free-photo-2210x1473.jpg?downloadTokenUuid=6bdba52f-af6b-49ae-5a5d-fd80bfb01d3b\n */\n url: string = \"\";\n\n /**\n * 此预览引擎支持的文件后缀名。\n * 星好*表示匹配所有的后缀名。\n * 逗号分隔,不带. 例如: xls,doc,ppt,xlsx,docx,pptx\n */\n extensions: string = \"\";\n\n /**\n * 本站预览,新标签打开\n */\n previewInSite: boolean = true;\n\n constructor() {\n super();\n }\n\n getForm(): any {\n return {\n url: this.url,\n extensions: this.extensions,\n previewInSite: this.previewInSite,\n };\n }\n\n //提供几个默认的预览引擎。\n static defaultPreviewEngines(): PreviewEngine[] {\n let defaultEngines: PreviewEngine[] = [];\n\n //添加office默认预览引擎,使用微软开放接口\n let officeEngine: PreviewEngine = new PreviewEngine();\n officeEngine.url =\n \"https://view.officeapps.live.com/op/embed.aspx?src={url}\";\n officeEngine.extensions = \"doc,ppt,xls,docx,pptx,xlsx\";\n officeEngine.previewInSite = true;\n defaultEngines.push(officeEngine);\n\n //添加全局预览引擎,使用浏览器预览能力。\n let globalEngine: PreviewEngine = new PreviewEngine();\n globalEngine.url = \"{originUrl}\";\n globalEngine.extensions = \"*\";\n globalEngine.previewInSite = true;\n defaultEngines.push(globalEngine);\n\n return defaultEngines;\n }\n\n //对于某个文件,是否能够预览\n canPreview(fileName: string): boolean {\n let extension: string = MimeUtil.getExtensionWithoutDot(fileName);\n if (!extension) {\n return false;\n }\n\n let canHandle = false;\n if (this.extensions === \"*\") {\n canHandle = true;\n } else {\n let parts: string[] = this.extensions.split(\",\");\n for (let part of parts) {\n if (\n extension === part.toLowerCase() ||\n \".\" + extension === part.toLowerCase()\n ) {\n canHandle = true;\n break;\n }\n }\n }\n\n return canHandle;\n }\n}\n","/**\r\n * 预览配置\r\n * 支持自定义不同的文件预览类型\r\n */\r\nimport Base from \"../../base/Base\";\r\nimport PreviewEngine from \"./PreviewEngine\";\r\nimport MimeUtil from \"../../../util/MimeUtil\";\r\nimport MessageBoxUtil from \"../../../util/MessageBoxUtil\";\r\n\r\n/**\r\n * 预览配置\r\n */\r\nexport default class PreviewConfig extends Base {\r\n\r\n /**\r\n * 预览引擎\r\n */\r\n previewEngines: PreviewEngine[] = []\r\n\r\n constructor() {\r\n\r\n super()\r\n\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n\r\n this.assignList(\"previewEngines\", PreviewEngine)\r\n }\r\n\r\n\r\n getForm(): any {\r\n\r\n let forms = this.previewEngines.map((item: PreviewEngine, index: number) => {\r\n return item.getForm()\r\n })\r\n\r\n return {\r\n previewEngines: forms\r\n };\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import SelectionOption from \"../../base/option/SelectionOption\";\r\nimport Lang from \"../../global/Lang\";\r\n\r\nenum ScanCronType {\r\n TEN_SECONDS = \"TEN_SECONDS\",\r\n THIRTY_SECONDS = \"THIRTY_SECONDS\",\r\n MINUTE = \"MINUTE\",\r\n HOUR = \"HOUR\",\r\n CUSTOM = \"CUSTOM\",\r\n}\r\n\r\nconst ScanCronTypes: ScanCronType[] = Object.keys(ScanCronType).map(\r\n (k) => k as ScanCronType\r\n);\r\n\r\nconst ScanCronTypeMap: { [key in keyof typeof ScanCronType]: SelectionOption } = {\r\n TEN_SECONDS: {\r\n name: Lang.t(\"preference.scanPerTenSeconds\"),\r\n value: \"@every 10s\",\r\n },\r\n THIRTY_SECONDS: {\r\n name: Lang.t(\"preference.scanPerThirtySeconds\"),\r\n value: \"@every 30s\",\r\n },\r\n MINUTE: {\r\n name: Lang.t(\"preference.scanPerMinute\"),\r\n value: \"@every 1m\",\r\n },\r\n HOUR: {\r\n name: Lang.t(\"preference.scanPerHour\"),\r\n value: \"0 * * * *\",\r\n },\r\n CUSTOM: {\r\n name: Lang.t(\"preference.scanCustom\"),\r\n value: \"CUSTOM\",\r\n },\r\n};\r\n\r\nconst ScanCronTypeList: SelectionOption[] = [];\r\nScanCronTypes.forEach((type: ScanCronType) => {\r\n ScanCronTypeList.push(ScanCronTypeMap[type]);\r\n});\r\n\r\nconst ScanCronTypeValueList: string[] = [];\r\nScanCronTypes.forEach((type: ScanCronType) => {\r\n ScanCronTypeValueList.push(ScanCronTypeMap[type].value);\r\n});\r\n\r\nexport { ScanCronType, ScanCronTypeMap, ScanCronTypeList, ScanCronTypeValueList };\r\n","/**\r\n * 扫描配置\r\n */\r\nimport { LabeledValue } from 'antd/lib/select';\r\nimport Base from \"../../base/Base\";\r\nimport { ScanScopeType } from \"./ScanScopeType\";\r\nimport { ScanCronType } from \"./ScanCronType\";\r\n\r\nexport default class ScanConfig extends Base {\r\n // 是否开启\r\n enable: boolean = false;\r\n // cron表达式 定时任务用\r\n cron: string | null = null;\r\n // 扫描磁盘开启范围(全部用户 or 局部用户)\r\n scope: ScanScopeType = ScanScopeType.ALL;\r\n // 开启扫描磁盘功能的用户们\r\n usernames: string[] = [];\r\n\r\n // 前端辅助字段\r\n cronType: string | null = null;\r\n users: LabeledValue[] = [];\r\n\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n }\r\n\r\n getForm(): any {\r\n return {\r\n enable: this.enable,\r\n scope: this.scope,\r\n cron: this.cronType === ScanCronType.CUSTOM ? this.cron : this.cronType,\r\n usernames: this.usernames,\r\n };\r\n }\r\n}\r\n","import SafeUtil from '../../util/SafeUtil';\r\nimport BaseEntity from '../base/BaseEntity';\r\nimport PreviewConfig from \"./model/PreviewConfig\";\r\nimport JsonUtil from \"../../util/JsonUtil\";\r\nimport ScanConfig from \"./model/ScanConfig\";\r\n\r\n\r\nexport default class Preference extends BaseEntity {\r\n\r\n //获取当前登录者的信息\r\n static URL_API_PREFERENCE_FETCH = '/api/preference/fetch'\r\n static URL_API_SYSTEM_CLEANUP = '/api/preference/system/cleanup'\r\n static URL_API_PREFERENCE_EDIT_PREVIEW_CONFIG = '/api/preference/edit/preview/config'\r\n static URL_API_PREFERENCE_EDIT_SCAN = '/api/preference/edit/scan/config'\r\n static URL_API_PREFERENCE_SCAN_ONCE = '/api/preference/scan/once'\r\n\r\n\r\n //网站名称\r\n name: string = \"\"\r\n\r\n //logo\r\n logoUrl: string | null = null\r\n faviconUrl: string | null = null\r\n\r\n //版权信息\r\n copyright: string = \"\"\r\n record: string = \"\"\r\n\r\n //大小限制\r\n downloadDirMaxSize: number = -1\r\n //文件数量\r\n downloadDirMaxNum: number = -1\r\n //用户默认总大小限制\r\n defaultTotalSizeLimit: number = -1\r\n //回收站保存文件天数\r\n deletedKeepDays: number = 7\r\n //是否允许自主注册\r\n allowRegister: boolean = false\r\n //预览配置\r\n previewConfig: PreviewConfig = new PreviewConfig()\r\n //扫描磁盘配置\r\n scanConfig: ScanConfig = new ScanConfig()\r\n //后台版本\r\n version: string | null = null\r\n\r\n\r\n //*****************前端辅助变量***********************/\r\n //网站是否完成了安装\r\n installed: boolean = true\r\n\r\n constructor(reactComponent?: React.Component) {\r\n\r\n super(reactComponent);\r\n\r\n }\r\n\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n\r\n this.assignEntity(\"previewConfig\", PreviewConfig)\r\n this.assignEntity(\"scanConfig\", ScanConfig)\r\n }\r\n\r\n getRecycleBinStatus() {\r\n return this.deletedKeepDays > 0\r\n }\r\n\r\n getForm(): any {\r\n return {\r\n name: this.name,\r\n logoUrl: this.logoUrl,\r\n faviconUrl: this.faviconUrl,\r\n copyright: this.copyright,\r\n record: this.record,\r\n downloadDirMaxNum: this.downloadDirMaxNum,\r\n downloadDirMaxSize: this.downloadDirMaxSize,\r\n defaultTotalSizeLimit: this.defaultTotalSizeLimit,\r\n deletedKeepDays: this.deletedKeepDays,\r\n allowRegister: this.allowRegister,\r\n previewConfig: JsonUtil.toJson(this.previewConfig.getForm()),\r\n scanConfig: JsonUtil.toJson(this.scanConfig.getForm())\r\n };\r\n }\r\n\r\n\r\n //修改title和favicon\r\n updateTitleAndFavicon() {\r\n\r\n if (this.faviconUrl) {\r\n //修改favicon\r\n let link: any = document.querySelector(\"link[rel*='icon']\") || document.createElement('link');\r\n link.type = 'image/x-icon';\r\n link.rel = 'shortcut icon';\r\n link.href = this.faviconUrl;\r\n document.getElementsByTagName('head')[0].appendChild(link);\r\n }\r\n\r\n document.title = this.name\r\n\r\n }\r\n\r\n httpFetch(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n this.httpPost(Preference.URL_API_PREFERENCE_FETCH, {}, function (response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n that.updateTitleAndFavicon()\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n httpSystemCleanup(password: string, successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n this.httpPost(Preference.URL_API_SYSTEM_CLEANUP, {password}, function (response: any) {\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n httpSavePreviewEngine(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n const that = this\r\n this.httpPost(Preference.URL_API_PREFERENCE_EDIT_PREVIEW_CONFIG, this.getForm(), function(response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback);\r\n\r\n }\r\n\r\n httpSaveScan(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n const that = this\r\n this.httpPost(Preference.URL_API_PREFERENCE_EDIT_SCAN, this.getForm(), function(response: any) {\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback);\r\n\r\n }\r\n\r\n httpScanOnce(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n this.httpGet(Preference.URL_API_PREFERENCE_SCAN_ONCE, {}, function (response: any) {\r\n SafeUtil.safeCallback(successCallback)(response);\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","/**\n * 全局性的对象,主要和实体类相关的\n * 这个类只包含Base的子类,比如User, Preference.\n * 和Sun形成姊妹篇\n */\nimport User from \"../user/User\";\nimport Preference from \"../preference/Preference\";\nimport Matter from \"../matter/Matter\";\n\n\nexport default class Moon {\n\n //全局具有唯一的用户,即当前登录的用户.\n user: User = new User()\n\n //全局唯一的偏好设置\n preference: Preference = new Preference()\n\n //全局的一个store对象\n private static singleton: Moon | null = null\n\n //使用懒加载模式。\n static getSingleton(): Moon {\n if (Moon.singleton == null) {\n Moon.singleton = new Moon();\n\n }\n\n return Moon.singleton\n }\n\n}\n","import React from 'react';\nimport {Link, RouteComponentProps} from \"react-router-dom\";\nimport \"./Login.less\"\nimport TankComponent from \"../../common/component/TankComponent\";\nimport {Button, Col, Form, Input, Row} from 'antd';\nimport User from \"../../common/model/user/User\";\nimport Moon from \"../../common/model/global/Moon\";\nimport {LockOutlined, UserOutlined} from '@ant-design/icons';\nimport Sun from \"../../common/model/global/Sun\";\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\nimport Preference from \"../../common/model/preference/Preference\";\nimport Lang from \"../../common/model/global/Lang\";\n\n\ninterface IProps extends RouteComponentProps {\n\n}\n\ninterface IState {\n\n}\n\nexport default class Login extends TankComponent {\n\n user: User = Moon.getSingleton().user\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n\n //进入登录页面,默认退出一次\n this.logout()\n }\n\n //退出登录\n logout() {\n\n let that = this\n\n this.user.httpLogout(function () {\n //刷新整个网站\n Sun.updateFrame()\n })\n\n }\n\n onFinish(values: any) {\n\n\n let that = this\n\n let user = that.user\n\n user.httpLogin(values[\"username\"], values[\"password\"], function () {\n MessageBoxUtil.success(Lang.t(\"user.loginSuccess\"))\n\n that.props.history.push('/')\n\n })\n\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n\n render() {\n\n let that = this\n let preference: Preference = Moon.getSingleton().preference\n\n\n return (\n
\n\n \n \n\n
\n {Lang.t(\"user.welcomeLogin\")}\n
\n\n \n \n }/>\n \n\n \n }/>\n \n\n \n \n \n\n {\n preference.allowRegister && (\n
\n \n {Lang.t(\"user.toToRegister\")}\n \n
\n )\n }\n\n\n \n\n \n
\n\n
\n );\n }\n}\n\n\n","import React from 'react';\nimport {Link, RouteComponentProps} from \"react-router-dom\";\nimport \"./Register.less\"\nimport TankComponent from \"../../common/component/TankComponent\";\nimport {Button, Col, Form, Input, Row} from 'antd';\nimport User from \"../../common/model/user/User\";\nimport Moon from \"../../common/model/global/Moon\";\nimport {LockOutlined, UserOutlined} from '@ant-design/icons';\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\nimport Lang from \"../../common/model/global/Lang\";\n\n\ninterface IProps extends RouteComponentProps {\n\n}\n\ninterface IState {\n\n}\n\nexport default class Register extends TankComponent {\n\n user: User = Moon.getSingleton().user\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n\n }\n\n onFinish(values: any) {\n\n let that = this\n\n let user = that.user\n\n user.httpRegister(values[\"username\"], values[\"password\"], function () {\n MessageBoxUtil.success(Lang.t(\"user.loginSuccess\"))\n\n that.props.history.push('/')\n\n })\n\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n\n render() {\n\n let that = this\n\n return (\n
\n\n \n \n\n
\n {Lang.t(\"user.welcomeRegister\")}\n
\n\n \n \n }/>\n \n\n \n }/>\n \n\n ({\n validator(rule, value) {\n if (!value || getFieldValue('password') === value) {\n return Promise.resolve();\n }\n return Promise.reject(Lang.t(\"user.passwordNotSame\"));\n },\n }),\n ]}\n >\n\n }/>\n \n\n \n \n \n\n\n
\n \n {Lang.t(\"user.goToLogin\")}\n \n
\n\n\n \n\n \n
\n\n
\n );\n }\n}\n\n\n","import BaseEntity from './BaseEntity';\r\nimport NumberUtil from '../../util/NumberUtil';\r\nimport SafeUtil from '../../util/SafeUtil';\r\nimport BrowserUtil from '../../util/BrowserUtil';\r\nimport StringUtil from '../../util/StringUtil';\r\nimport ObjectUtil from '../../util/ObjectUtil';\r\nimport Filter from './filter/Filter';\r\nimport SortFilter from './filter/SortFilter';\r\nimport HttpBase from './HttpBase';\r\n\r\n/**\r\n * 一个分页帮助器,可以去后台请求数据,也可以渲染需要数据源。\r\n * 这个类具有非常神奇的能力,可以说是整个项目含金量最高的一个类!\r\n */\r\nexport default class Pager extends HttpBase {\r\n\r\n static MAX_PAGE_SIZE = 500;\r\n\r\n /**\r\n * 当前分页大小 0基\r\n */\r\n page: number = 0;\r\n /**\r\n * 每一页的大小\r\n */\r\n pageSize: number = 10;\r\n /**\r\n * 总的条目数量\r\n */\r\n totalItems: number = 0;\r\n /**\r\n * 总的页数\r\n */\r\n totalPages: number = 0;\r\n\r\n /**\r\n * 返回的数据,类型为泛型\r\n */\r\n data: T[] = [];\r\n\r\n /**\r\n * 类。这个很特殊。\r\n */\r\n Clazz: any = null;\r\n\r\n /**\r\n * 分页的url链接地址\r\n */\r\n urlPage: string | null = null;\r\n\r\n /**\r\n * 过滤筛选器\r\n */\r\n filters: Filter[] = [];\r\n\r\n /**\r\n * 是否要求在浏览器中保存参数\r\n */\r\n history: boolean = false;\r\n\r\n\r\n constructor(reactComponent: React.Component | null, Clazz: any, pageSize = 20) {\r\n\r\n super(reactComponent);\r\n\r\n this.pageSize = pageSize;\r\n\r\n //这里的处理利用了js的原型调用链,比较魔法。\r\n if (Clazz && (Clazz.prototype instanceof BaseEntity)) {\r\n this.Clazz = Clazz;\r\n\r\n let urlPage = Clazz.prototype.getUrlList();\r\n if (urlPage) {\r\n this.urlPage = urlPage;\r\n } else {\r\n console.error(Clazz + '必须定义分页url');\r\n }\r\n\r\n if (Clazz.prototype.getFilters) {\r\n\r\n //直接获取该类的过滤器。\r\n this.filters = Clazz.prototype.getFilters();\r\n\r\n } else {\r\n\r\n console.error('The Clazz MUST define a prototype method named \\'getFilters\\'');\r\n\r\n }\r\n\r\n } else {\r\n console.error('You MUST specify a Clazz extended BaseEntity');\r\n }\r\n }\r\n\r\n //把obj中的属性,赋值到this中来。采用深拷贝。\r\n assign(obj: any) {\r\n\r\n super.assign(obj);\r\n\r\n this.assignList('data', this.Clazz);\r\n\r\n }\r\n\r\n\r\n //该方法是在地址栏添加上query参数,参数就是filters中的key和value.\r\n //同时地址栏上有的参数也会自动读取到filters中去\r\n //因此,启用该方法后返回时可以停留在之前的页码中。\r\n enableHistory() {\r\n this.history = true;\r\n\r\n let queryPageNum: string | null = BrowserUtil.getQueryByName('page');\r\n let queryPageSize: string | null = BrowserUtil.getQueryByName('pageSize');\r\n\r\n if (queryPageNum !== null && queryPageNum !== '') {\r\n this.page = parseInt(queryPageNum);\r\n }\r\n\r\n if (queryPageSize !== null && queryPageSize !== '') {\r\n this.pageSize = parseInt(queryPageSize);\r\n }\r\n\r\n if (!NumberUtil.isInteger(this.page)) {\r\n this.page = 0;\r\n }\r\n if (!NumberUtil.isInteger(this.pageSize)) {\r\n this.pageSize = 10;\r\n }\r\n\r\n\r\n //从请求参数中传值。\r\n for (let i = 0; i < this.filters.length; i++) {\r\n\r\n let filter: Filter = this.filters[i];\r\n\r\n let queryValue = BrowserUtil.getQueryByName(filter.key);\r\n\r\n if (queryValue !== null && queryValue !== '') {\r\n\r\n filter.putValue(queryValue);\r\n\r\n } else {\r\n filter.reset();\r\n }\r\n }\r\n }\r\n\r\n\r\n //重置所有过滤器\r\n resetFilter() {\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n filter.reset();\r\n }\r\n };\r\n\r\n //重置排序过滤器\r\n resetSortFilters() {\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n if (filter instanceof SortFilter) {\r\n filter.reset();\r\n }\r\n }\r\n };\r\n\r\n\r\n //手动设置过滤器的值\r\n setFilterValue(key: string, value: any) {\r\n if (!this.filters || !this.filters.length) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.filters.length; i++) {\r\n\r\n let filter = this.filters[i];\r\n\r\n if (filter.key === key) {\r\n filter.putValue(value);\r\n }\r\n\r\n }\r\n };\r\n\r\n setFilterValues(obj: any) {\r\n const keys = Object.keys(obj);\r\n if(keys.length) {\r\n keys.forEach(key => this.setFilterValue(key, obj[key]))\r\n }\r\n };\r\n\r\n\r\n //根据key来删除某个Filter\r\n removeFilter(key: string) {\r\n if (!this.filters || !this.filters.length) {\r\n return;\r\n }\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n if (filter.key === key) {\r\n this.filters.splice(i, 1);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n\r\n //隐藏某个Filter,实际上我们可以根据这个filter来筛选,只不过不出现在NbFilter中而已。\r\n showFilter(key: string, visible = true) {\r\n if (!this.filters || !this.filters.length) {\r\n return;\r\n }\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n if (filter.key === key) {\r\n filter.visible = visible;\r\n break;\r\n }\r\n }\r\n };\r\n\r\n showAllFilter(visible = true) {\r\n if (!this.filters || !this.filters.length) {\r\n return;\r\n }\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n filter.visible = visible;\r\n }\r\n }\r\n\r\n //根据一个key来获取某个filter\r\n getFilter(key: string): Filter | null {\r\n if (!this.filters || !this.filters.length) {\r\n return null;\r\n }\r\n\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n if (filter.key === key) {\r\n return filter;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n //根据一个key来获取某个filter\r\n getFilterValue(key: string) {\r\n let filter = this.getFilter(key);\r\n if (!filter) {\r\n return null\r\n } else {\r\n return filter.getValueString()\r\n }\r\n };\r\n\r\n\r\n /**\r\n * 获取当前进行sort的那个filter\r\n * 我们认为一次只有一个排序值\r\n */\r\n getCurrentSortFilter(): Filter | null {\r\n\r\n if (!this.filters || !this.filters.length) {\r\n return null;\r\n }\r\n\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n if (filter instanceof SortFilter) {\r\n if (!filter.isEmpty()) {\r\n return filter;\r\n }\r\n }\r\n\r\n }\r\n return null;\r\n }\r\n\r\n\r\n //获取所有的filter参数,键值对形式\r\n getParams(): { [s: string]: string | number } {\r\n\r\n let params: { [s: string]: string | number } = {\r\n page: this.page,\r\n pageSize: this.pageSize,\r\n };\r\n\r\n if (!this.filters || !this.filters.length) {\r\n return params;\r\n }\r\n\r\n for (let i = 0; i < this.filters.length; i++) {\r\n let filter = this.filters[i];\r\n\r\n if (!filter.isEmpty()) {\r\n params[filter.key] = filter.getValueString();\r\n }\r\n }\r\n\r\n return params;\r\n };\r\n\r\n\r\n //元素是否为空\r\n isEmpty(): boolean {\r\n return !this.data || !this.data.length;\r\n }\r\n\r\n //去服务器端进行请求\r\n httpList(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n\r\n let that = this;\r\n\r\n let params: { [s: string]: string | number } = this.getParams();\r\n\r\n\r\n if (this.history) {\r\n window.history.replaceState({}, '', window.location.pathname + '?' + ObjectUtil.param(params));\r\n }\r\n\r\n\r\n //准备去请求,所有错误置为空\r\n this.errorMessage = null;\r\n\r\n this.httpGet(this.urlPage, params, function(response: any) {\r\n // handle success\r\n\r\n that.assign(response.data.data);\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, function(errorMessage: any, response: any) {\r\n\r\n //失败了就清空\r\n that.data = [];\r\n\r\n SafeUtil.safeCallback(errorCallback)(errorMessage, response);\r\n\r\n }, finalCallback);\r\n\r\n }\r\n\r\n\r\n //从pager中获取当前的分页情况,在table的分页器中显示 PaginationConfig\r\n getPagination(): any | false {\r\n let that = this;\r\n\r\n if (this.totalPages > 1) {\r\n return {\r\n current: that.page + 1,\r\n pageSize: that.pageSize,\r\n total: that.totalItems,\r\n showTotal: (totalNum: number) => '共' + totalNum + '条',\r\n showSizeChanger: true,\r\n };\r\n } else {\r\n return false;\r\n }\r\n\r\n\r\n }\r\n\r\n //获取默认的排序顺序,提供给table使用\r\n getDefaultSortOrder(columnKey: string): any | boolean {\r\n\r\n //将变化的这个情况更新。\r\n let filterKey = 'order' + StringUtil.capitalize(columnKey);\r\n\r\n //直接放进排序值即可,底层会自动兼容\r\n let sortFilter = this.getFilter(filterKey);\r\n\r\n if (sortFilter && (sortFilter instanceof SortFilter)) {\r\n\r\n let antdSortValue: any | null = sortFilter.getAntdValue();\r\n if (antdSortValue) {\r\n return antdSortValue;\r\n } else {\r\n return false;\r\n }\r\n\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n\r\n\r\n //在table的分页器 发生变化调用 TODO: PaginationConfig SorterResult TableCurrentDataSource\r\n tableOnChange(pagination: any, filters: any, sorter: any, extra: any) {\r\n let that = this;\r\n\r\n if (pagination.current !== undefined) {\r\n that.page = pagination.current - 1;\r\n }\r\n\r\n if (pagination.pageSize !== undefined) {\r\n\r\n that.pageSize = pagination.pageSize;\r\n }\r\n\r\n\r\n //重置所有的sort\r\n that.resetSortFilters();\r\n if (!StringUtil.isEmptyObject(sorter)) {\r\n\r\n //将变化的这个情况更新。\r\n let filterKey = 'order' + StringUtil.capitalize(StringUtil.underScoreToCamel(sorter.field));\r\n\r\n\r\n //直接放进排序值即可,底层会自动兼容\r\n that.setFilterValue(filterKey, sorter.order);\r\n\r\n }\r\n\r\n //直接去刷新\r\n that.httpList();\r\n }\r\n\r\n //清空data中的数据。\r\n clear() {\r\n this.data = [];\r\n this.page = 0;\r\n this.totalItems = 0;\r\n this.totalPages = 0;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import MimeUtil from \"./MimeUtil\";\r\nimport StringUtil from \"./StringUtil\";\r\nimport Lang from \"../model/global/Lang\";\r\nimport CSV from \"comma-separated-values\";\r\n\r\nexport default class FileUtil {\r\n static isImage(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return StringUtil.startWith(mimeType, \"image\");\r\n }\r\n\r\n static isPdf(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return StringUtil.startWith(mimeType, \"application/pdf\");\r\n }\r\n\r\n static isText(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return StringUtil.startWith(mimeType, \"text\");\r\n }\r\n\r\n static isDoc(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return (\r\n StringUtil.startWith(mimeType, \"application/msword\") ||\r\n StringUtil.startWith(\r\n mimeType,\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\r\n )\r\n );\r\n }\r\n\r\n static isPpt(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return (\r\n StringUtil.startWith(mimeType, \"application/vnd.ms-powerpoint\") ||\r\n StringUtil.startWith(\r\n mimeType,\r\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\r\n )\r\n );\r\n }\r\n\r\n static isXls(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return (\r\n StringUtil.startWith(mimeType, \"application/vnd.ms-excel\") ||\r\n StringUtil.startWith(\r\n mimeType,\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n )\r\n );\r\n }\r\n\r\n static isAudio(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return StringUtil.startWith(mimeType, \"audio\");\r\n }\r\n\r\n static isVideo(name: string | null): boolean {\r\n let mimeType = MimeUtil.getMimeType(name);\r\n return StringUtil.startWith(mimeType, \"video\");\r\n }\r\n\r\n static isPsd(name: string | null): boolean {\r\n let extension = MimeUtil.getExtension(name);\r\n return extension === \".psd\";\r\n }\r\n\r\n /**\r\n * 根据名字获取对应的图标。imageIcon传值了,那么图片格式采用imageIcon\r\n * @param name\r\n * @param idDir\r\n */\r\n static getIcon(name: string | null, idDir: boolean = false): any {\r\n if (idDir) {\r\n return require(\"../../assets/image/file/folder.svg\");\r\n }\r\n\r\n if (FileUtil.isPdf(name)) {\r\n return require(\"../../assets/image/file/pdf.svg\");\r\n } else if (FileUtil.isDoc(name)) {\r\n return require(\"../../assets/image/file/doc.svg\");\r\n } else if (FileUtil.isPpt(name)) {\r\n return require(\"../../assets/image/file/ppt.svg\");\r\n } else if (FileUtil.isXls(name)) {\r\n return require(\"../../assets/image/file/xls.svg\");\r\n } else if (FileUtil.isAudio(name)) {\r\n return require(\"../../assets/image/file/audio.svg\");\r\n } else if (\r\n FileUtil.isVideo(name) ||\r\n MimeUtil.getExtension(name) === \".mkv\"\r\n ) {\r\n return require(\"../../assets/image/file/video.svg\");\r\n } else if (FileUtil.isText(name)) {\r\n return require(\"../../assets/image/file/text.svg\");\r\n } else if (FileUtil.isPsd(name)) {\r\n return require(\"../../assets/image/file/psd.svg\");\r\n } else if (FileUtil.isImage(name)) {\r\n return require(\"../../assets/image/file/image.svg\");\r\n } else if (\r\n StringUtil.endWith(name, \"zip\") ||\r\n StringUtil.endWith(name, \"rar\") ||\r\n StringUtil.endWith(name, \"7z\") ||\r\n StringUtil.endWith(name, \"tar\") ||\r\n StringUtil.endWith(name, \"tar\") ||\r\n StringUtil.endWith(name, \"gz\")\r\n ) {\r\n return require(\"../../assets/image/file/archive.svg\");\r\n } else {\r\n return require(\"../../assets/image/file/file.svg\");\r\n }\r\n }\r\n\r\n\r\n //把一个大小转变成方便读的格式\r\n //human readable file size\r\n static humanFileSize(bytes: number, si: boolean = false): string {\r\n if (bytes == -1) {\r\n return Lang.t(\"preference.noLimit\")\r\n }\r\n\r\n let thresh = si ? 1000 : 1024\r\n if (Math.abs(bytes) < thresh) {\r\n return bytes + ' B'\r\n }\r\n let units = si\r\n ? ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\r\n : ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\r\n let u = -1\r\n do {\r\n bytes /= thresh\r\n ++u\r\n } while (Math.abs(bytes) >= thresh && u < units.length - 1)\r\n return bytes.toFixed(1) + ' ' + units[u]\r\n }\r\n\r\n static getErrorLogsToCSVUrl(logs: object) {\r\n const _utf = \"\\uFEFF\"; // 为了使文件以utf-8的编码模式,同时也是解决中文乱码的问题\r\n if (window.Blob && window.URL && window.URL.createObjectURL) {\r\n const csvStr = new CSV(logs, {\r\n header: [\"filename\", \"path\", \"errorMsg\"],\r\n }).encode();\r\n const blob = new Blob([_utf + csvStr], {\r\n type: \"text/csv\",\r\n });\r\n return URL.createObjectURL(blob);\r\n }\r\n return \"\";\r\n };\r\n\r\n}\r\n","import React from 'react';\r\n\r\nimport {Input} from 'antd';\r\nimport InputFilter from \"../../../common/model/base/filter/InputFilter\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\n\r\n\r\ninterface IProps {\r\n inputFilter: InputFilter\r\n onChange?: (value: string | null) => void\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class InputFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n }\r\n\r\n //改变某个filter的值\r\n onValueChange(event: any) {\r\n\r\n let that = this\r\n\r\n let inputFilter: InputFilter = this.props.inputFilter\r\n\r\n inputFilter.value = event.target.value\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(inputFilter.value)\r\n\r\n //更新UI\r\n that.setState({})\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let inputFilter: InputFilter = this.props.inputFilter\r\n\r\n return (\r\n \r\n \r\n \r\n {inputFilter.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import Filter from \"./Filter\";\r\nimport DateUtil from \"../../../util/DateUtil\";\r\n\r\n\r\n/**\r\n *\r\n * 时间筛选器\r\n *\r\n */\r\nexport default class DateTimeFilter extends Filter {\r\n\r\n //时间筛选的格式\r\n format: string\r\n\r\n //值,最终填写的内容。null表示这个值不设置\r\n value: Date | null = null\r\n\r\n constructor(name: string, code: string, format?: string, visible?: boolean) {\r\n super(name, code, visible)\r\n if (format) {\r\n this.format = format\r\n } else {\r\n this.format = DateUtil.DEFAULT_FORMAT\r\n }\r\n }\r\n\r\n //获取值字符串\r\n getValueString(): string {\r\n if (this.value) {\r\n return DateUtil.format(this.value, this.format)\r\n } else {\r\n return \"\"\r\n }\r\n }\r\n\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: string) {\r\n\r\n this.value = DateUtil.parse(value)\r\n }\r\n\r\n\r\n reset() {\r\n this.value = null\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.value === null;\r\n }\r\n\r\n\r\n\r\n}\r\n","import React from 'react';\r\n\r\nimport {DatePicker} from 'antd';\r\nimport moment from \"moment\";\r\nimport DateTimeFilter from \"../../../common/model/base/filter/DateTimeFilter\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\n\r\ninterface IProps {\r\n dateTimeFilter: DateTimeFilter\r\n onChange?: (value: Date | null) => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\n\r\nclass DateTimeFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n //改变某个filter的值\r\n onValueChange(momentTime: moment.Moment | null, dateString: string) {\r\n\r\n let that = this\r\n\r\n let filter = this.props.dateTimeFilter\r\n\r\n if (momentTime) {\r\n\r\n filter.value = momentTime.toDate()\r\n\r\n } else {\r\n filter.value = null\r\n }\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(filter.value)\r\n\r\n //更新UI\r\n that.setState({})\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let dateTimeFilter = this.props.dateTimeFilter\r\n\r\n let value: moment.Moment | undefined = undefined\r\n if (dateTimeFilter.value) {\r\n value = moment(dateTimeFilter.value)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {dateTimeFilter.name}\r\n \r\n \r\n\r\n {\r\n that.onValueChange(date, dateString)\r\n }}/>\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default DateTimeFilterBox;\r\n","import Filter from \"./Filter\";\r\n\r\n\r\n/**\r\n *\r\n * Checkbox筛选框过滤器\r\n *\r\n */\r\nexport default class CheckFilter extends Filter {\r\n\r\n //值,最终填写的内容。null表示这个值不设置\r\n value: boolean | null = null\r\n\r\n constructor(name: string, code: string, visible?: boolean) {\r\n super(name, code, visible)\r\n }\r\n\r\n\r\n //获取值字符串,[null,true,false] => [\"\",\"true\",\"false\"]\r\n getValueString(): string {\r\n let stringValue = \"\"\r\n if (this.value === true) {\r\n stringValue = \"true\"\r\n } else if (this.value === false) {\r\n stringValue = \"false\"\r\n } else {\r\n stringValue = \"\"\r\n }\r\n return stringValue\r\n }\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: any) {\r\n\r\n if (value === \"true\" || value === true) {\r\n this.value = true\r\n } else if (value === \"false\" || value === false) {\r\n this.value = false\r\n } else {\r\n this.value = null\r\n }\r\n }\r\n\r\n reset() {\r\n this.value = null\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.value === null;\r\n }\r\n\r\n}\r\n","import React from 'react';\r\n\r\nimport {Select} from 'antd';\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport CheckFilter from \"../../../common/model/base/filter/CheckFilter\";\r\n\r\nconst Option = Select.Option;\r\n\r\ninterface IProps {\r\n checkFilter: CheckFilter\r\n onChange?: (value: boolean | null) => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class CheckFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n //改变某个filter的值\r\n onValueChange = (value: string) => {\r\n\r\n let that = this\r\n\r\n let checkFilter = this.props.checkFilter\r\n\r\n checkFilter.putValue(value)\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(checkFilter.value)\r\n\r\n //更新UI\r\n that.setState({})\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let checkFilter = this.props.checkFilter\r\n\r\n //用于回填的值\r\n let backValue = checkFilter.getValueString()\r\n\r\n return (\r\n \r\n\r\n \r\n \r\n {checkFilter.name}\r\n \r\n\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\n\r\nimport {Radio, Select} from 'antd';\r\nimport SelectionFilter from \"../../../common/model/base/filter/SelectionFilter\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport SelectionOption from \"../../../common/model/base/option/SelectionOption\";\r\nimport SelectionFilterType from \"../../../common/model/base/filter/SelectionFilterType\";\r\n\r\n\r\nconst Option = Select.Option;\r\n\r\ninterface IProps {\r\n selectionFilter: SelectionFilter\r\n onChange?: (value: string) => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class SelectionFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n //改变某个filter的值\r\n onValueChange = (value: any) => {\r\n\r\n let that = this\r\n\r\n let selectionFilter = this.props.selectionFilter\r\n\r\n selectionFilter.value = value\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)()\r\n\r\n //更新UI\r\n that.setState({})\r\n\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let selectionFilter = this.props.selectionFilter\r\n\r\n if (selectionFilter.selectionType === SelectionFilterType.COMBOBOX) {\r\n return (\r\n \r\n \r\n \r\n {selectionFilter.name}\r\n \r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n {selectionFilter.name}\r\n \r\n {\r\n this.onValueChange(e.target.value)\r\n }}\r\n //不希望对\"全部\"进行回填。\r\n value={selectionFilter.value === '' ? undefined : selectionFilter.value}\r\n >\r\n 全部\r\n {selectionFilter.options ?\r\n selectionFilter.options.map((item: SelectionOption, index: number) => {\r\n return {item.name}\r\n })\r\n : null}\r\n \r\n \r\n \r\n\r\n );\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\n\r\nimport {Select} from 'antd';\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport SortFilter from \"../../../common/model/base/filter/SortFilter\";\r\nimport SortDirection from \"../../../common/model/base/SortDirection\";\r\n\r\nconst Option = Select.Option;\r\n\r\ninterface IProps {\r\n sortFilter: SortFilter\r\n onChange?: (value: SortDirection | null) => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class SortFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n //改变某个filter的值\r\n onValueChange = (value: string) => {\r\n\r\n let that = this\r\n\r\n let sortFilter = this.props.sortFilter\r\n\r\n sortFilter.putValue(value)\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(sortFilter.value)\r\n\r\n //更新UI\r\n that.setState({})\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let sortFilter = this.props.sortFilter\r\n\r\n return (\r\n \r\n\r\n \r\n \r\n {sortFilter.name}\r\n \r\n\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n\r\n","import SelectionFilter from \"./SelectionFilter\";\r\nimport SelectionFilterType from \"./SelectionFilterType\";\r\n\r\n\r\n/**\r\n *\r\n * 从远程拉取一个筛选项的过滤器\r\n *\r\n */\r\nexport default class HttpSelectionFilter extends SelectionFilter {\r\n\r\n //远程的访问链接。\r\n url: string\r\n\r\n constructor(name: string, code: string, url: string, selectionType?: SelectionFilterType, visible?: boolean) {\r\n super(name, code, [], selectionType, visible)\r\n this.url = url\r\n }\r\n\r\n //通过一个字符串来设置值\r\n //远程调用的值必须要宽容,因为值可能还没有从远程取回来呢。\r\n putValue(value: string) {\r\n this.value = value\r\n }\r\n\r\n //严格的回填,采用父类的策略\r\n //这个方法会在http请求完成了之后调用。HttpSelectionFilter中会调用\r\n strictPutValue(value: string) {\r\n super.putValue(value)\r\n }\r\n\r\n}\r\n","import React from 'react';\r\n\r\nimport {Radio, Select} from \"antd\"\r\nimport HttpUtil from \"../../../common/util/HttpUtil\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport SelectionOption from \"../../../common/model/base/option/SelectionOption\";\r\nimport HttpSelectionFilter from \"../../../common/model/base/filter/HttpSelectionFilter\";\r\nimport SelectionFilterType from \"../../../common/model/base/filter/SelectionFilterType\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\n\r\n\r\nconst Option = Select.Option;\r\n\r\ninterface IProps {\r\n httpSelectionFilter: HttpSelectionFilter\r\n onChange?: (value: string) => void\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\n\r\nexport default class HttpSelectionFilterBox extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n\r\n this.refresh()\r\n }\r\n\r\n refresh() {\r\n //刷新一下列表\r\n let that = this\r\n\r\n let filter = this.props.httpSelectionFilter\r\n\r\n let url = filter.url\r\n\r\n HttpUtil.httpGet(url, {}, function (response: any) {\r\n\r\n //尝试一次回填。因为这个时候才知道之前那个值是否有效。\r\n filter.options = response.data.data\r\n filter.strictPutValue(filter.value)\r\n\r\n that.updateUI()\r\n })\r\n\r\n }\r\n\r\n //改变某个filter的值\r\n onValueChange = (value: any) => {\r\n let that = this\r\n\r\n let filter = this.props.httpSelectionFilter\r\n\r\n filter.value = value\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(filter.value)\r\n\r\n //更新UI\r\n that.updateUI()\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let filter = this.props.httpSelectionFilter\r\n\r\n let selectionOptions = filter.options\r\n\r\n if (filter.selectionType === SelectionFilterType.COMBOBOX) {\r\n return (\r\n \r\n \r\n \r\n {filter.name}\r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n\r\n \r\n {filter.name}\r\n \r\n {\r\n this.onValueChange(e.target.value)\r\n }}\r\n //不希望对\"全部\"进行回填。\r\n value={filter.value === '' ? undefined : filter.value}\r\n >\r\n 全部\r\n {\r\n selectionOptions.map((item: SelectionOption, index: number) => {\r\n return {item.name}\r\n })\r\n }\r\n \r\n \r\n \r\n\r\n );\r\n }\r\n\r\n\r\n }\r\n}\r\n\r\n","import React from 'react';\r\n\r\nimport {DatePicker} from 'antd';\r\nimport moment from \"moment\";\r\nimport {default as DateFilter} from \"../../../common/model/base/filter/DateFilter\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\n\r\ninterface IProps {\r\n dateFilter: DateFilter\r\n onChange?: (value: Date | null) => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\n\r\nclass DateFilterBox extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n //改变某个filter的值\r\n onValueChange(momentTime: moment.Moment | null, dateString: string) {\r\n\r\n let that = this\r\n\r\n let filter = this.props.dateFilter\r\n\r\n if (momentTime) {\r\n\r\n filter.value = momentTime.toDate()\r\n\r\n } else {\r\n filter.value = null\r\n }\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(filter.value)\r\n\r\n //更新UI\r\n that.setState({})\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let dateFilter = this.props.dateFilter\r\n\r\n let value: moment.Moment | undefined = undefined\r\n if (dateFilter.value) {\r\n value = moment(dateFilter.value)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {dateFilter.name}\r\n \r\n \r\n\r\n {\r\n that.onValueChange(date, dateString)\r\n }}/>\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default DateFilterBox;\r\n","import Filter from \"./Filter\";\r\nimport DateUtil from \"../../../util/DateUtil\";\r\n\r\n\r\n/**\r\n *\r\n * 时间筛选器\r\n *\r\n */\r\nexport default class DateFilter extends Filter {\r\n\r\n //时间筛选的格式\r\n format: string\r\n\r\n //值,最终填写的内容。null表示这个值不设置\r\n value: Date | null = null\r\n\r\n constructor(name: string, code: string, format?: string, visible?: boolean) {\r\n super(name, code, visible)\r\n if (format) {\r\n this.format = format\r\n } else {\r\n this.format = DateUtil.DATE_FORMAT\r\n }\r\n }\r\n\r\n //获取值字符串\r\n getValueString(): string {\r\n if (this.value) {\r\n return DateUtil.format(this.value, this.format)\r\n } else {\r\n return \"\"\r\n }\r\n }\r\n\r\n\r\n //通过一个字符串来设置值\r\n putValue(value: string) {\r\n\r\n this.value = DateUtil.parse(value)\r\n }\r\n\r\n\r\n reset() {\r\n this.value = null\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.value === null;\r\n }\r\n\r\n\r\n\r\n}\r\n","import React from 'react';\r\nimport './FilterPanel.less';\r\nimport SafeUtil from '../../../common/util/SafeUtil';\r\nimport Filter from '../../../common/model/base/filter/Filter';\r\nimport InputFilter from '../../../common/model/base/filter/InputFilter';\r\nimport InputFilterBox from './InputFilterBox';\r\nimport DateTimeFilter from '../../../common/model/base/filter/DateTimeFilter';\r\nimport DateTimeFilterBox from './DateTimeFilterBox';\r\nimport CheckFilter from '../../../common/model/base/filter/CheckFilter';\r\nimport CheckFilterBox from './CheckFilterBox';\r\nimport SelectionFilter from '../../../common/model/base/filter/SelectionFilter';\r\nimport SelectionFilterBox from './SelectionFilterBox';\r\nimport SortFilter from '../../../common/model/base/filter/SortFilter';\r\nimport SortFilterBox from './SortFilterBox';\r\nimport HttpSelectionFilter from '../../../common/model/base/filter/HttpSelectionFilter';\r\nimport HttpSelectionFilterBox from './HttpSelectionFilterBox';\r\nimport {Button} from 'antd';\r\n\r\nimport DateFilterBox from './DateFilterBox';\r\nimport DateFilter from '../../../common/model/base/filter/DateFilter';\r\n\r\n\r\ninterface IProps {\r\n onChange?: (value: any, key: any) => void\r\n\r\n filters: Filter[]\r\n\r\n //Selection 筛选宽松模式 会使用Button,单独占一行的模式。\r\n selectionButtonLoose?: boolean\r\n\r\n //重置按钮触发\r\n onReset?: () => void\r\n\r\n //懒搜索模式,点击按钮时才触发搜索的动作,当传递了内容,就会出现搜索按钮。\r\n onSearch?: () => void\r\n\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\n\r\n/**\r\n * 这里是筛选面板。\r\n * 如果需要调整筛选面板的样式。\r\n * 请在自己的类中,通过css覆盖的方式来修改样式。\r\n */\r\nexport default class FilterPanel extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n //当改变某个filter的值\r\n onChildChange(value: any, key: any) {\r\n\r\n let that = this;\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onChange)(value, key);\r\n\r\n //更新UI\r\n that.setState({});\r\n\r\n }\r\n\r\n //当改变某个filter的值\r\n onReset() {\r\n\r\n let that = this;\r\n let filters = that.props.filters;\r\n\r\n for (let i = 0; i < filters.length; i++) {\r\n let filter = filters[i];\r\n filter.reset();\r\n }\r\n\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onReset)();\r\n\r\n //更新UI\r\n that.setState({});\r\n }\r\n\r\n\r\n //当改变某个filter的值\r\n onSearch() {\r\n\r\n let that = this;\r\n\r\n //通知外面变化了。\r\n SafeUtil.safeCallback(that.props.onSearch)();\r\n\r\n //更新UI\r\n that.setState({});\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this;\r\n //router中传入的路由相关对象\r\n let filters = this.props.filters;\r\n\r\n let needSearchButton: boolean = !!this.props.onSearch;\r\n\r\n let needResetButton: boolean = !!this.props.onReset;\r\n\r\n return (\r\n
\r\n {\r\n filters.map(((filter: Filter, index: number) => {\r\n\r\n if ((filter instanceof InputFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof DateTimeFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof DateFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof CheckFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof HttpSelectionFilter) && filter.visible) {\r\n //注意,子类放前面,父类放后面\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof SelectionFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else if ((filter instanceof SortFilter) && filter.visible) {\r\n return (\r\n {\r\n that.onChildChange(val, filter.key);\r\n }}/>\r\n );\r\n } else {\r\n return null;\r\n }\r\n\r\n }))\r\n }\r\n\r\n
\r\n \r\n 重置条件\r\n \r\n\r\n \r\n 搜索\r\n \r\n\r\n
\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n","import React from 'react';\r\nimport {Empty} from 'antd';\r\nimport EmptyImage from \"../../assets/image/empty.svg\"\r\nimport ErrorImage from \"../../assets/image/error.png\"\r\nimport SafeUtil from \"../../common/util/SafeUtil\";\r\nimport \"./TableEmpty.less\"\r\nimport Pager from \"../../common/model/base/Pager\";\r\n\r\ninterface IProps {\r\n pager: Pager\r\n onRefresh?: () => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nclass TableEmpty extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let pager = this.props.pager\r\n\r\n\r\n let emptyContent = (\r\n
\r\n \r\n {\r\n SafeUtil.safeCallback(that.props.onRefresh)()\r\n }\r\n }>点击重试\r\n \r\n
\r\n )\r\n let errorContent = (\r\n
\r\n \r\n {\r\n SafeUtil.safeCallback(that.props.onRefresh)()\r\n }\r\n }>点击重试\r\n \r\n
\r\n )\r\n\r\n return (\r\n
\r\n {pager.errorMessage ? errorContent : (pager.data.length ? \"\" : emptyContent)}\r\n
\r\n\r\n )\r\n ;\r\n }\r\n}\r\n\r\nexport default TableEmpty;\r\n","import React from \"react\";\r\nimport \"./TankTitle.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\n\r\ninterface IProps {\r\n name: React.ReactNode;\r\n}\r\n\r\ninterface IState {}\r\n\r\n/**\r\n * 标题导航快捷插件\r\n */\r\nexport default class TankTitle extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n
\r\n \r\n {this.props.name}\r\n \r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import SafeUtil from \"./SafeUtil\";\r\n\r\nexport default class ClipboardUtil {\r\n\r\n\r\n /**\r\n * 复制一段文字到粘贴板。\r\n *\r\n */\r\n static copy(text: string, successCallback: () => void, errorCallback?: () => void) {\r\n\r\n let className = \"clipboard-textarea-util\"\r\n\r\n let textAreaElement: HTMLTextAreaElement | null = document.querySelector(\".\" + className);\r\n\r\n if (!textAreaElement) {\r\n textAreaElement = document.createElement(\"textarea\")\r\n textAreaElement.className = className\r\n textAreaElement.style.cssText = \"position:fixed;opacity:0;z-index:0;width:5px;height:5px;\"\r\n document.body.appendChild(textAreaElement)\r\n }\r\n\r\n textAreaElement.value = text\r\n textAreaElement.select();\r\n\r\n try {\r\n let successful = document.execCommand('copy');\r\n if (successful) {\r\n successCallback()\r\n } else {\r\n SafeUtil.safeCallback(errorCallback)()\r\n }\r\n } catch (err) {\r\n console.error('复制失败', err);\r\n SafeUtil.safeCallback(errorCallback)()\r\n }\r\n }\r\n\r\n}\r\n","import React from 'react';\r\nimport Button from 'antd/lib/button';\r\nimport {Modal} from \"antd\"\r\nimport \"./TransfigurationModal.less\"\r\nimport User from \"../../../common/model/user/User\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport BrowserUtil from \"../../../common/util/BrowserUtil\";\r\nimport ClipboardUtil from \"../../../common/util/ClipboardUtil\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport Moon from \"../../../common/model/global/Moon\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n user: User\r\n onClose: () => void\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class TransfigurationModal extends TankComponent {\r\n\r\n authentication: string = \"\"\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n\r\n let that = this\r\n\r\n this.props.user.httpTransfiguration(function (text: string) {\r\n\r\n that.authentication = text\r\n that.updateUI()\r\n\r\n })\r\n\r\n }\r\n\r\n static open(user: User) {\r\n\r\n let modal = Modal.success({\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\"\r\n },\r\n icon: null,\r\n content: {\r\n modal.destroy()\r\n }}/>,\r\n })\r\n\r\n }\r\n\r\n render() {\r\n\r\n\r\n let that = this\r\n\r\n let textToCopy = BrowserUtil.fullHost() + \"/user/authentication/\" + that.authentication\r\n\r\n return (\r\n
\r\n\r\n
\r\n

\r\n {Lang.t(\"user.transfigurationPromptText\")}\r\n

\r\n
\r\n
\r\n {Lang.t(\"user.transfigurationPrompt\")}\r\n
\r\n
\r\n {textToCopy}\r\n
\r\n\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n","import React from 'react';\r\nimport {Link, RouteComponentProps} from 'react-router-dom';\r\nimport './List.less';\r\nimport SortDirection from '../../common/model/base/SortDirection';\r\nimport Pager from '../../common/model/base/Pager';\r\nimport StringUtil from '../../common/util/StringUtil';\r\nimport FileUtil from '../../common/util/FileUtil';\r\nimport DateUtil from '../../common/util/DateUtil';\r\nimport FilterPanel from '../widget/filter/FilterPanel';\r\nimport TableEmpty from '../widget/TableEmpty';\r\nimport User from \"../../common/model/user/User\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport {ColumnProps} from 'antd/lib/table';\r\nimport {Table, Button, Modal, Tag, Tooltip} from \"antd\";\r\nimport {CheckCircleOutlined, PlusOutlined, StopOutlined, UserSwitchOutlined} from '@ant-design/icons';\r\nimport {UserRoleMap} from \"../../common/model/user/UserRole\";\r\nimport {UserStatus, UserStatusMap} from \"../../common/model/user/UserStatus\";\r\nimport {DeleteOutlined, EditOutlined, ExclamationCircleFilled} from \"@ant-design/icons/lib\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport Color from \"../../common/model/base/option/Color\";\r\nimport TransfigurationModal from \"./widget/TransfigurationModal\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\n\r\n\r\ninterface IProps extends RouteComponentProps {\r\n\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\n\r\nexport default class List extends TankComponent {\r\n\r\n //获取分页的一个帮助器\r\n pager: Pager = new Pager(this, User, 10);\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n\r\n //刷新一下列表\r\n let that = this;\r\n\r\n that.pager.enableHistory();\r\n\r\n that.refresh();\r\n }\r\n\r\n search() {\r\n let that = this;\r\n that.pager.page = 0;\r\n that.refresh();\r\n }\r\n\r\n refresh() {\r\n\r\n let that = this;\r\n\r\n //如果没有任何的排序,默认使用时间倒序\r\n if (!that.pager.getCurrentSortFilter()) {\r\n that.pager.setFilterValue('orderCreateTime', SortDirection.DESC);\r\n }\r\n\r\n that.pager.httpList();\r\n }\r\n\r\n toggleStatus(user: User) {\r\n let that = this\r\n user.httpToggleStatus(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"))\r\n that.updateUI()\r\n })\r\n }\r\n\r\n\r\n delete(user: User) {\r\n let that = this\r\n Modal.confirm({\r\n title: Lang.t(\"user.deleteHint\", user.username),\r\n icon: ,\r\n onOk: () => {\r\n user.httpDel(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"))\r\n that.refresh()\r\n })\r\n },\r\n });\r\n\r\n }\r\n\r\n\r\n transfiguration(user: User) {\r\n\r\n let that = this\r\n TransfigurationModal.open(user)\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this;\r\n\r\n //router中传入的路由相关对象\r\n let match = this.props.match;\r\n\r\n //pager对象\r\n let pager = this.pager;\r\n\r\n let user: User = Moon.getSingleton().user\r\n\r\n const columns: ColumnProps[] = [{\r\n title: Lang.t(\"user.avatar\"),\r\n dataIndex: 'avatarUrl',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n \r\n \"avatar\"\r\n \r\n ),\r\n }, {\r\n title: Lang.t(\"user.username\"),\r\n dataIndex: 'username',\r\n render: (text: any, record: User, index: number): React.ReactNode => {\r\n return
\r\n
\r\n {record.username}\r\n
\r\n {\r\n user.uuid === record.uuid && (\r\n
(It's you)
\r\n )\r\n }\r\n
\r\n },\r\n }, {\r\n title: Lang.t(\"user.role\"),\r\n dataIndex: 'role',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n {UserRoleMap[record.role].name}\r\n ),\r\n }, {\r\n title: Lang.t(\"user.singleFileSizeLimit\"),\r\n dataIndex: 'sizeLimit',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n {FileUtil.humanFileSize(record.sizeLimit)}\r\n ),\r\n }, {\r\n title: Lang.t(\"user.totalFileSize\"),\r\n dataIndex: 'totalSize',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n {FileUtil.humanFileSize(record.totalSize)}\r\n ),\r\n }, {\r\n title: Lang.t(\"user.totalFileSizeLimit\"),\r\n dataIndex: 'totalSizeLimit',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n {FileUtil.humanFileSize(record.totalSizeLimit)}\r\n ),\r\n }, {\r\n title: Lang.t(\"user.status\"),\r\n dataIndex: 'status',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n {UserStatusMap[record.status].name}\r\n ),\r\n }, {\r\n title: Lang.t(\"user.lastLogin\"),\r\n dataIndex: 'lastTime',\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n
\r\n
{record.lastIp}
\r\n
{DateUtil.simpleDateTime(record.lastTime)}
\r\n
\r\n ),\r\n }, {\r\n title: Lang.t(\"createTime\"),\r\n dataIndex: 'createTime',\r\n sorter: true,\r\n sortOrder: pager.getDefaultSortOrder('createTime'),\r\n sortDirections: [SortDirection.DESCEND, SortDirection.ASCEND],\r\n render: (text: any, record: User, index: number): React.ReactNode => (\r\n DateUtil.simpleDateTime(text)\r\n ),\r\n }, {\r\n title: Lang.t(\"operation\"),\r\n dataIndex: 'action',\r\n render: (text: any, record: User) => (\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n {\r\n record.status === UserStatus.OK && record.uuid !== user.uuid && (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n {\r\n record.status === UserStatus.DISABLED && record.uuid !== user.uuid && (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n {\r\n record.status === UserStatus.DISABLED && record.uuid !== user.uuid && (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n {\r\n record.uuid !== user.uuid && (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n\r\n\r\n\r\n \r\n ),\r\n }];\r\n\r\n return (\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n )}}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\nimport \"./InfoCell.less\"\r\nimport {Col, Row} from \"antd\"\r\n\r\ninterface IProps {\r\n name: string\r\n firstSpan?: number\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class InfoCell extends React.Component {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = {}\r\n }\r\n\r\n\r\n\r\n componentDidMount() {\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this\r\n let name: string = this.props.name\r\n\r\n let firstSpan: number = 8\r\n if (this.props.firstSpan !== undefined) {\r\n firstSpan = this.props.firstSpan\r\n }\r\n let secondSpan: number = 24 - firstSpan\r\n\r\n return (\r\n \r\n {name}\r\n \r\n {that.props.children}\r\n \r\n \r\n )\r\n }\r\n}\r\n\r\n","import React, { Component } from \"react\";\r\nimport VelocityReact from \"velocity-react\";\r\n\r\ninterface IProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class Expanding extends Component {\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport InfoCell from \"../../widget/InfoCell\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport User from \"../../../common/model/user/User\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { UserRoleMap } from \"../../../common/model/user/UserRole\";\r\nimport { Tag, Tooltip } from \"antd\";\r\nimport FileUtil from \"../../../common/util/FileUtil\";\r\nimport {\r\n UserStatus,\r\n UserStatusMap,\r\n} from \"../../../common/model/user/UserStatus\";\r\nimport DateUtil from \"../../../common/util/DateUtil\";\r\nimport {\r\n EditOutlined,\r\n StopOutlined,\r\n CheckCircleOutlined,\r\n UserSwitchOutlined,\r\n DeleteOutlined,\r\n EllipsisOutlined,\r\n} from \"@ant-design/icons\";\r\nimport Color from \"../../../common/model/base/option/Color\";\r\nimport Expanding from \"../../widget/Expanding\";\r\nimport \"./MobileUserPanel.less\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport Sun from \"../../../common/model/global/Sun\";\r\n\r\ninterface IProps {\r\n user: User;\r\n isCurrentUser: boolean;\r\n onToggleStatus: (user: User) => any;\r\n onDelete: (user: User) => any;\r\n onTransfiguration: (user: User) => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class MobileUserPanel extends TankComponent {\r\n // 小屏幕下操作栏\r\n showMore: boolean = false;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n clickRow = () => {\r\n Sun.navigateTo(`/user/detail/${this.props.user.uuid}`);\r\n };\r\n\r\n toggleHandles = () => {\r\n this.showMore = !this.showMore;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { user, isCurrentUser } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n \r\n

{user.username}

\r\n \r\n {UserRoleMap[user.role].name}\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.toggleHandles())\r\n }\r\n />\r\n
\r\n\r\n \r\n {this.showMore ? (\r\n
\r\n \r\n {FileUtil.humanFileSize(user.sizeLimit)}\r\n \r\n \r\n {FileUtil.humanFileSize(user.totalSize)}\r\n \r\n \r\n {FileUtil.humanFileSize(user.totalSizeLimit)}\r\n \r\n \r\n \r\n {UserStatusMap[user.status].name}\r\n \r\n \r\n \r\n
\r\n
{user.lastIp}
\r\n
{DateUtil.simpleDateTime(user.lastTime)}
\r\n
\r\n
\r\n \r\n {DateUtil.simpleDateTime(user.createTime)}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {user.status === UserStatus.OK && !isCurrentUser && (\r\n \r\n this.props.onToggleStatus(user)}\r\n />\r\n \r\n )}\r\n {user.status === UserStatus.DISABLED && !isCurrentUser && (\r\n <>\r\n \r\n this.props.onToggleStatus(user)}\r\n />\r\n \r\n \r\n this.props.onDelete(user)}\r\n />\r\n \r\n \r\n )}\r\n {!isCurrentUser && (\r\n \r\n this.props.onTransfiguration(user)}\r\n />\r\n \r\n )}\r\n
\r\n
\r\n
\r\n ) : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Link, RouteComponentProps } from \"react-router-dom\";\r\nimport \"./MobileList.less\";\r\nimport SortDirection from \"../../common/model/base/SortDirection\";\r\nimport Pager from \"../../common/model/base/Pager\";\r\nimport User from \"../../common/model/user/User\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport { Button, Modal, Input, Pagination } from \"antd\";\r\nimport { PlusOutlined, ExclamationCircleFilled } from \"@ant-design/icons\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport Color from \"../../common/model/base/option/Color\";\r\nimport TransfigurationModal from \"./widget/TransfigurationModal\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport MobileUserPanel from \"./widget/MobileUserPanel\";\r\n\r\ninterface IProps extends RouteComponentProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class MobileList extends TankComponent {\r\n //获取分页的一个帮助器\r\n pager: Pager = new Pager(this, User, 10);\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount(): void {\r\n this.pager.enableHistory();\r\n this.refresh();\r\n }\r\n\r\n search = () => {\r\n this.pager.page = 0;\r\n this.refresh();\r\n };\r\n\r\n refresh = () => {\r\n //如果没有任何的排序,默认使用时间倒序\r\n if (!this.pager.getCurrentSortFilter()) {\r\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\r\n }\r\n this.pager.httpList();\r\n };\r\n\r\n toggleStatus = (user: User) => {\r\n user.httpToggleStatus(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.updateUI();\r\n });\r\n };\r\n\r\n delete = (user: User) => {\r\n Modal.confirm({\r\n title: Lang.t(\"user.deleteHint\", user.username),\r\n icon: ,\r\n onOk: () => {\r\n user.httpDel(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.refresh();\r\n });\r\n },\r\n });\r\n };\r\n\r\n transfiguration = (user: User) => {\r\n TransfigurationModal.open(user);\r\n };\r\n\r\n searchFile = (value?: string) => {\r\n this.pager.resetFilter();\r\n if (value) {\r\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\r\n this.pager.setFilterValue(\"username\", value);\r\n this.pager.httpList();\r\n } else {\r\n this.refresh();\r\n }\r\n };\r\n\r\n changeSearch = (e: any) => {\r\n if (!e.currentTarget.value) this.searchFile();\r\n };\r\n\r\n changePage = (page: number) => {\r\n this.pager.page = page - 1; // page的页数0基\r\n this.pager.httpList();\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { pager } = this;\r\n const currentUser = Moon.getSingleton().user;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n this.searchFile(value)}\r\n onChange={this.changeSearch}\r\n enterButton\r\n />\r\n
\r\n\r\n
\r\n {pager.data.map((user) => (\r\n \r\n ))}\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport \"./TankContentCard.less\"\r\nimport TankComponent from '../../common/component/TankComponent';\r\nimport {LoadingOutlined} from \"@ant-design/icons/lib\";\r\n\r\ninterface IProps {\r\n loading?: boolean\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\n/**\r\n * 正文样式\r\n */\r\nexport default class TankContentCard extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n\r\n //刷新一下列表\r\n let that = this\r\n\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let content: React.ReactNode\r\n\r\n if (that.props.loading) {\r\n content = (\r\n
\r\n \r\n
\r\n )\r\n } else {\r\n content = that.props.children\r\n }\r\n\r\n return (\r\n
\r\n {content}\r\n
\r\n );\r\n }\r\n}\r\n","import \"./ImagePreviewer.less\"\r\nimport PhotoSwipe from 'photoswipe'\r\nimport PhotoSwipeUIDefault from 'photoswipe/dist/photoswipe-ui-default'\r\n//PhotoSwipe的样式\r\nimport \"photoswipe/dist/photoswipe.css\";\r\nimport \"photoswipe/dist/default-skin/default-skin.css\";\r\n\r\n\r\n/**\r\n * 图片预览器\r\n * 支持预览一张图片或者多张图片\r\n */\r\nexport default class ImagePreviewer {\r\n\r\n private static pswpDom(): HTMLElement {\r\n let innerHTML = `\r\n \r\n
\r\n\r\n \r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n `\r\n\r\n let div: HTMLElement = document.createElement('div');\r\n div.className = \"pswp\";\r\n div.setAttribute(\"tabIndex\", \"-1\")\r\n div.setAttribute(\"role\", \"dialog\")\r\n div.setAttribute(\"aria-hidden\", \"true\")\r\n\r\n div.innerHTML = innerHTML\r\n\r\n return div\r\n }\r\n\r\n //展示一张图片\r\n static showSinglePhoto(url: string) {\r\n\r\n ImagePreviewer.showMultiPhoto([url], 0)\r\n\r\n }\r\n\r\n //展示一系列图片\r\n static showMultiPhoto(urls: string[], index: number = 0) {\r\n\r\n let that = this;\r\n let items: PhotoSwipe.Item[] = [];\r\n urls.forEach((url) => {\r\n items.push({\r\n src: url,\r\n w: 0,\r\n h: 0\r\n })\r\n })\r\n\r\n let options = {\r\n //不需要历史纪录\r\n history: false,\r\n //不需要全屏按钮\r\n fullscreenEl: false,\r\n //不需要分享按钮\r\n shareEl: false,\r\n //点击不要让控制按钮消失\r\n tapToToggleControls: false,\r\n //当前从第0张展示。\r\n index: index\r\n };\r\n\r\n //获取dom节点\r\n let div = ImagePreviewer.pswpDom()\r\n //添加到body\r\n document.body.appendChild(div);\r\n\r\n let photoSwipe = new PhotoSwipe(div, PhotoSwipeUIDefault, items, options);\r\n\r\n photoSwipe.listen('gettingData', function (index, item) {\r\n\r\n if (!item.w || !item.h || item.w < 1 || item.h < 1) {\r\n\r\n //这里为了获取图片真实大小\r\n const img: HTMLImageElement = new Image()\r\n img.onload = function () {\r\n item.w = img.width\r\n item.h = img.height\r\n photoSwipe.updateSize(true); // reinit Items\r\n }\r\n img.src = item.src!\r\n }\r\n })\r\n photoSwipe.init();\r\n\r\n photoSwipe.listen('close', () => {\r\n if (div.parentNode) {\r\n //移除节点\r\n div.parentNode.removeChild(div);\r\n }\r\n })\r\n photoSwipe.listen('afterChange', () => {\r\n\r\n })\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n","import React from 'react';\r\nimport Button from 'antd/lib/button';\r\nimport {Input, Modal} from \"antd\"\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\n\r\ninterface IProps {\r\n value: string\r\n title?: string\r\n onSuccess: (val: string) => void\r\n onClose: () => void\r\n}\r\n\r\ninterface IState {\r\n\r\n innerValue: string\r\n}\r\n\r\nexport default class SingleTextModal extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {\r\n innerValue: this.props.value\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n\r\n }\r\n\r\n static open(title: string, initialValue: string, onSuccess: (text: string) => void) {\r\n\r\n let modal = Modal.success({\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\"\r\n },\r\n icon: null,\r\n content: {\r\n\r\n modal.destroy()\r\n\r\n onSuccess(val)\r\n\r\n }}\r\n onClose={() => {\r\n modal.destroy()\r\n }}/>,\r\n })\r\n\r\n }\r\n\r\n\r\n onSubmitClick() {\r\n if (this.state.innerValue) {\r\n this.props.onSuccess(this.state.innerValue)\r\n } else {\r\n MessageBoxUtil.error(\"没有填写值,提交失败!\")\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n return (\r\n
\r\n\r\n
\r\n

\r\n {that.props.title}\r\n

\r\n
\r\n\r\n {\r\n that.setState({\r\n innerValue: e.target.value\r\n })\r\n\r\n }}/>\r\n\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n","import React from 'react';\nimport Button from 'antd/lib/button';\nimport {Form, Input, Modal} from \"antd\"\nimport TankComponent from \"../../../common/component/TankComponent\";\nimport User from \"../../../common/model/user/User\";\nimport Moon from \"../../../common/model/global/Moon\";\nimport Lang from \"../../../common/model/global/Lang\";\n\ninterface IProps {\n user: User\n onSuccess: () => void\n onClose: () => void\n}\n\ninterface IState {\n\n}\n\nexport default class ChangePasswordModal extends TankComponent {\n\n constructor(props: IProps) {\n super(props);\n this.state = {};\n }\n\n componentDidMount() {\n\n }\n\n static open(user: User, onSuccess: () => void) {\n\n let modal = Modal.success({\n okCancel: false,\n okButtonProps: {\n className: \"display-none\"\n },\n icon: null,\n content: {\n modal.destroy()\n onSuccess()\n }}\n onClose={() => {\n modal.destroy()\n }}/>,\n })\n\n }\n\n\n onFinish(values: any) {\n\n\n let that = this\n\n let currentUser: User = this.props.user\n\n currentUser.httpChangePassword(values[\"oldPassword\"], values[\"repeatPassword\"], function () {\n\n\n that.props.onSuccess()\n\n })\n\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n\n render() {\n\n let that = this\n\n const layout = {\n labelCol: {span: 8},\n wrapperCol: {span: 16},\n };\n const tailLayout = {\n wrapperCol: {offset: 8, span: 16},\n };\n\n return (\n
\n\n
\n

\n {Lang.t(\"user.editSomebodyPassword\", that.props.user.username)}\n

\n
\n\n \n \n \n \n\n \n \n \n\n ({\n validator(rule, value) {\n if (!value || getFieldValue('password') === value) {\n return Promise.resolve();\n }\n return Promise.reject(Lang.t(\"user.passwordNotSame\"));\n },\n }),\n ]}\n >\n \n \n\n\n \n\n \n\n \n\n \n\n \n\n\n
\n );\n }\n}\n\n\n\n\n","import React from \"react\";\r\nimport \"./Detail.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport { Button, Tag, Space } from \"antd\";\r\nimport InfoCell from \"../widget/InfoCell\";\r\nimport User from \"../../common/model/user/User\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport DateUtil from \"../../common/util/DateUtil\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport { Link, RouteComponentProps } from \"react-router-dom\";\r\nimport ImagePreviewer from \"../widget/previewer/ImagePreviewer\";\r\nimport { UserRole, UserRoleMap } from \"../../common/model/user/UserRole\";\r\nimport FileUtil from \"../../common/util/FileUtil\";\r\nimport { UserStatus, UserStatusMap } from \"../../common/model/user/UserStatus\";\r\nimport BrowserUtil from \"../../common/util/BrowserUtil\";\r\nimport SingleTextModal from \"../widget/SingleTextModal\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport ChangePasswordModal from \"./widget/ChangePasswordModal\";\r\nimport {\r\n EditOutlined,\r\n UnlockOutlined,\r\n UserSwitchOutlined,\r\n} from \"@ant-design/icons\";\r\nimport TransfigurationModal from \"./widget/TransfigurationModal\";\r\nimport { FileSyncOutlined, StopOutlined } from \"@ant-design/icons/lib\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\n\r\ninterface RouteParam {\r\n uuid: string;\r\n}\r\n\r\ninterface IProps extends RouteComponentProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class Detail extends TankComponent {\r\n //登录的那个用户\r\n user: User = Moon.getSingleton().user;\r\n\r\n //当前页面正在编辑的用户\r\n currentUser: User = new User(this);\r\n\r\n //sync loading.\r\n syncLoading: boolean = false;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n let that = this;\r\n let match = this.props.match;\r\n this.currentUser.uuid = match.params.uuid;\r\n this.currentUser.httpDetail();\r\n }\r\n\r\n resetPassword() {\r\n let that = this;\r\n\r\n SingleTextModal.open(Lang.t(\"user.enterNewPassword\"), \"\", function (\r\n text: string\r\n ) {\r\n that.currentUser.httpResetPassword(text, function (response: any) {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n });\r\n });\r\n }\r\n\r\n transfiguration() {\r\n let user: User = this.user;\r\n let currentUser: User = this.currentUser;\r\n TransfigurationModal.open(currentUser);\r\n }\r\n\r\n toggleStatus() {\r\n let that = this;\r\n let user: User = this.user;\r\n let currentUser: User = this.currentUser;\r\n currentUser.httpToggleStatus(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n that.updateUI();\r\n });\r\n }\r\n\r\n syncPhysics() {\r\n let that = this;\r\n let user: User = this.user;\r\n let currentUser: User = this.currentUser;\r\n this.syncLoading = true;\r\n currentUser.httpScan(\r\n function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n that.updateUI();\r\n },\r\n null,\r\n function () {\r\n that.syncLoading = false;\r\n that.updateUI();\r\n }\r\n );\r\n }\r\n\r\n changePassword() {\r\n let user: User = this.user;\r\n let currentUser: User = this.currentUser;\r\n ChangePasswordModal.open(currentUser, function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n });\r\n }\r\n\r\n render() {\r\n const user: User = this.user;\r\n const currentUser: User = this.currentUser;\r\n\r\n const handles = (\r\n \r\n {user.role === UserRole.ADMINISTRATOR && (\r\n }\r\n onClick={this.resetPassword.bind(this)}\r\n >\r\n {Lang.t(\"user.resetPassword\")}\r\n \r\n )}\r\n\r\n {user.role === UserRole.ADMINISTRATOR && (\r\n }\r\n onClick={this.transfiguration.bind(this)}\r\n >\r\n {Lang.t(\"user.transfiguration\")}\r\n \r\n )}\r\n\r\n {currentUser.uuid === user.uuid && (\r\n }\r\n >\r\n {Lang.t(\"user.changePassword\")}\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n {user.role === UserRole.ADMINISTRATOR &&\r\n currentUser.uuid !== user.uuid && (\r\n }\r\n onClick={this.toggleStatus.bind(this)}\r\n >\r\n {currentUser.status === UserStatus.OK\r\n ? Lang.t(\"user.disable\")\r\n : Lang.t(\"user.active\")}\r\n \r\n )}\r\n\r\n {user.role === UserRole.ADMINISTRATOR && (\r\n }\r\n loading={this.syncLoading}\r\n onClick={this.syncPhysics.bind(this)}\r\n >\r\n {Lang.t(\"user.sync\")}\r\n \r\n )}\r\n \r\n );\r\n\r\n return (\r\n
\r\n \r\n {!Sun.getSingleton().isMobile && handles}\r\n \r\n {Sun.getSingleton().isMobile && handles}\r\n\r\n \r\n
\r\n {\r\n ImagePreviewer.showSinglePhoto(currentUser.getAvatarUrl(true));\r\n }}\r\n />\r\n
{currentUser.username}
\r\n
\r\n\r\n \r\n \r\n {UserRoleMap[currentUser.role].name}\r\n \r\n \r\n\r\n \r\n {FileUtil.humanFileSize(currentUser.sizeLimit)}\r\n \r\n\r\n \r\n {FileUtil.humanFileSize(currentUser.totalSizeLimit)}\r\n \r\n\r\n \r\n {FileUtil.humanFileSize(currentUser.totalSize)}\r\n \r\n\r\n \r\n \r\n {UserStatusMap[currentUser.status].name}\r\n \r\n \r\n\r\n \r\n {currentUser.lastIp}\r\n \r\n\r\n \r\n {DateUtil.simpleDateTime(currentUser.lastTime)}\r\n \r\n\r\n \r\n {BrowserUtil.fullHost() + \"/api/dav\"}\r\n \r\n\r\n {currentUser.role === UserRole.ADMINISTRATOR && (\r\n \r\n \r\n https://tank-doc.eyeblue.cn\r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","export default class EnvUtil {\r\n static currentHost() {\r\n return window.location.protocol + \"//\" + window.location.host;\r\n }\r\n}\r\n","import \"./BrowserPreviewer.less\"\nimport React from \"react\";\nimport * as ReactDOM from 'react-dom';\nimport FileUtil from \"../../../common/util/FileUtil\";\nimport {CloseOutlined} from \"@ant-design/icons\";\n\ninterface IProps {\n name: string\n url: string\n size: number\n onClose: () => void\n}\n\ninterface IState {\n\n}\n\n/**\n * 浏览器预览器\n * 浏览器支持的预览格式统统交由它处理\n */\nexport default class BrowserPreviewer extends React.Component {\n\n constructor(props: IProps) {\n super(props);\n this.state = {};\n }\n\n componentDidMount() {\n\n }\n\n //展示一系列图片\n static show(name: string, url: string, size: number) {\n\n let that = this;\n\n const div: Element = document.createElement('div');\n document.body.appendChild(div);\n\n let element: React.ReactElement = React.createElement(\n BrowserPreviewer,\n {\n name: name,\n url: url,\n size: size,\n onClose: () => {\n //删除所有节点。\n const unmountResult = ReactDOM.unmountComponentAtNode(div);\n if (unmountResult && div.parentNode) {\n\n div.parentNode.removeChild(div);\n\n }\n }\n }\n )\n\n //将react组件挂载到div中去。\n ReactDOM.render(element, div);\n\n }\n\n render() {\n return
\n
\n\n
\n\n
\n\n
\n {this.props.name}({FileUtil.humanFileSize(this.props.size)})\n
\n\n
\n \n {\n this.props.onClose()\n }}/>\n \n
\n\n\n
\n
\n \n
\n
\n }\n\n}\n\n","import BaseEntity from \"../../base/BaseEntity\";\r\nimport DateUtil from \"../../../util/DateUtil\";\r\nimport SafeUtil from \"../../../util/SafeUtil\";\r\n\r\nexport default class DownloadToken extends BaseEntity {\r\n userUuid: string | null = null;\r\n matterUuid: string | null = null;\r\n expireTime: string | null = null;\r\n ip: string | null = null;\r\n\r\n static URL_FETCH_DOWNLOAD_TOKEN = \"/api/alien/fetch/download/token\";\r\n\r\n constructor(reactComponent?: React.Component) {\r\n super(reactComponent);\r\n }\r\n\r\n getUrlPrefix() {\r\n return \"/api/download/token\";\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n this.assignEntity(\"expireTime\", Date);\r\n }\r\n\r\n getFilters() {\r\n return [...super.getFilters()];\r\n }\r\n\r\n httpFetchDownloadToken(\r\n matterUuid: string,\r\n successCallback?: () => any,\r\n errorCallback?: () => any\r\n ) {\r\n let that = this;\r\n let date = new Date(new Date().getTime() + 10 * 60 * 1000);\r\n\r\n let form = {\r\n expireTime: DateUtil.simpleDateTime(date),\r\n matterUuid,\r\n };\r\n this.httpPost(\r\n DownloadToken.URL_FETCH_DOWNLOAD_TOKEN,\r\n form,\r\n function (response: any) {\r\n that.assign(response.data.data);\r\n SafeUtil.safeCallback(successCallback)(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n}\r\n","import \"./ImagePreviewer.less\";\r\nimport MimeUtil from \"../../../common/util/MimeUtil\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport Moon from \"../../../common/model/global/Moon\";\r\nimport PreviewEngine from \"../../../common/model/preference/model/PreviewEngine\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport BrowserPreviewer from \"./BrowserPreviewer\";\r\nimport DownloadToken from \"../../../common/model/download/token/DownloadToken\";\r\n\r\n/**\r\n * 文件预览帮助器\r\n */\r\nexport default class PreviewerHelper {\r\n /**\r\n * 准备好一个文件url\r\n */\r\n static prepareMatterUrl(\r\n matter: Matter,\r\n needTokenUrl: boolean,\r\n successCallback: (matterUrl: string) => void\r\n ) {\r\n if (needTokenUrl) {\r\n //获取一个临时的下载token.\r\n let downloadToken = new DownloadToken();\r\n downloadToken.httpFetchDownloadToken(matter.uuid!, function () {\r\n let matterUrl = matter.getPreviewUrl(downloadToken.uuid!);\r\n\r\n successCallback(matterUrl);\r\n });\r\n } else {\r\n successCallback(matter.getPreviewUrl());\r\n }\r\n }\r\n\r\n /**\r\n * 对一个文件进行预览,自动选择预览引擎\r\n * @param matter 文件\r\n * @param previewUrl 文件预览url,分享文件预览需从外部把previewUrl传入\r\n */\r\n static preview(matter: Matter, previewUrl?: string) {\r\n let fileName: string = matter.name;\r\n let extension: string = MimeUtil.getExtensionWithoutDot(fileName);\r\n if (!extension) {\r\n MessageBoxUtil.warning(fileName + \" 没有后缀名,无法预览\");\r\n return;\r\n }\r\n\r\n //去选择预览引擎。\r\n let previewConfig = Moon.getSingleton().preference.previewConfig;\r\n\r\n let previewEngine: PreviewEngine | null = null;\r\n\r\n //寻找用户自定义的预览引擎\r\n for (let engine of previewConfig.previewEngines) {\r\n if (engine.canPreview(fileName)) {\r\n previewEngine = engine;\r\n break;\r\n }\r\n }\r\n\r\n //寻找官方默认的预览引擎\r\n if (previewEngine === null) {\r\n let defaultEngines = PreviewEngine.defaultPreviewEngines();\r\n for (let engine of defaultEngines) {\r\n if (engine.canPreview(fileName)) {\r\n previewEngine = engine;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (previewEngine === null) {\r\n MessageBoxUtil.warning(fileName + \" 无法预览\");\r\n } else {\r\n let targetUrl = previewEngine.url;\r\n\r\n const engine: PreviewEngine = previewEngine;\r\n\r\n if(previewUrl) {\r\n targetUrl = targetUrl.replace(\"{originUrl}\", previewUrl);\r\n targetUrl = targetUrl.replace(\"{url}\", previewUrl);\r\n if (engine.previewInSite) {\r\n BrowserPreviewer.show(fileName, targetUrl, matter.size);\r\n } else {\r\n window.open(targetUrl);\r\n }\r\n } else {\r\n const needToken = matter.privacy && targetUrl.indexOf(\"{url}\") !== -1;\r\n\r\n PreviewerHelper.prepareMatterUrl(matter, needToken, function (url) {\r\n targetUrl = targetUrl.replace(\"{originUrl}\", matter.getPreviewUrl());\r\n targetUrl = targetUrl.replace(\"{url}\", encodeURIComponent(url));\r\n\r\n if (engine.previewInSite) {\r\n BrowserPreviewer.show(fileName, targetUrl, matter.size);\r\n } else {\r\n window.open(targetUrl);\r\n }\r\n });\r\n }\r\n\r\n }\r\n }\r\n}\r\n","import { message } from \"antd\";\r\nimport axios, { CancelTokenSource } from \"axios\";\r\nimport BaseEntity from \"../base/BaseEntity\";\r\nimport Filter from \"../base/filter/Filter\";\r\nimport HttpUtil from \"../../util/HttpUtil\";\r\nimport FileUtil from \"../../util/FileUtil\";\r\nimport ImageUtil from \"../../util/ImageUtil\";\r\nimport EnvUtil from \"../../util/EnvUtil\";\r\nimport InputFilter from \"../base/filter/InputFilter\";\r\nimport CheckFilter from \"../base/filter/CheckFilter\";\r\nimport SortFilter from \"../base/filter/SortFilter\";\r\nimport MimeUtil from \"../../util/MimeUtil\";\r\nimport StringUtil from \"../../util/StringUtil\";\r\nimport NumberUtil from \"../../util/NumberUtil\";\r\nimport SafeUtil from \"../../util/SafeUtil\";\r\nimport ImagePreviewer from \"../../../pages/widget/previewer/ImagePreviewer\";\r\nimport MessageBoxUtil from \"../../util/MessageBoxUtil\";\r\nimport PreviewerHelper from \"../../../pages/widget/previewer/PreviewerHelper\";\r\n\r\nexport default class Matter extends BaseEntity {\r\n puuid: string = \"\";\r\n userUuid: string = \"\";\r\n dir: boolean = false;\r\n alien: boolean = false;\r\n name: string = \"\";\r\n md5: string | null = null;\r\n size: number = 0;\r\n privacy: boolean = true;\r\n path: string | null = null;\r\n times: number = 0;\r\n //上次访问时间\r\n visitTime: Date | null = null;\r\n parent: Matter | null = null;\r\n // 文件是否被软删除\r\n deleted: boolean = false;\r\n deleteTime: Date | null = null;\r\n\r\n /*\r\n 这部分是辅助UI的字段信息\r\n */\r\n //作为勾选变量\r\n check: boolean = false;\r\n editMode: boolean = false;\r\n\r\n //允许用户选择的文件类型\r\n filter: string = \"*\";\r\n //本地字段\r\n //给用户的提示文字\r\n uploadHint: string | null = null;\r\n //浏览器中选择好的原生file,未作任何处理。\r\n file: File | null = null;\r\n //当前上传进度的数值 0-1之间\r\n progress: number = 0;\r\n //实时上传速度 byte/s\r\n speed: number = 0;\r\n //取消上传source\r\n cancelSource: CancelTokenSource = axios.CancelToken.source();\r\n\r\n static URL_MATTER_CREATE_DIRECTORY = \"/api/matter/create/directory\";\r\n static URL_MATTER_SOFT_DELETE = \"/api/matter/soft/delete\";\r\n static URL_MATTER_SOFT_DELETE_BATCH = \"/api/matter/soft/delete/batch\";\r\n static URL_MATTER_RECOVERY = \"/api/matter/recovery\";\r\n static URL_MATTER_RECOVERY_BATCH = \"/api/matter/recovery/batch\";\r\n static URL_MATTER_DELETE = \"/api/matter/delete\";\r\n static URL_MATTER_DELETE_BATCH = \"/api/matter/delete/batch\";\r\n static URL_MATTER_RENAME = \"/api/matter/rename\";\r\n static URL_CHANGE_PRIVACY = \"/api/matter/change/privacy\";\r\n static URL_MATTER_MOVE = \"/api/matter/move\";\r\n static URL_MATTER_DOWNLOAD = \"/api/matter/download\";\r\n static URL_MATTER_UPLOAD = \"/api/matter/upload\";\r\n static URL_MATTER_ZIP = \"/api/matter/zip\";\r\n\r\n static MATTER_ROOT = \"root\";\r\n\r\n //下载zip包\r\n static downloadZip(uuidsString: string) {\r\n window.open(\r\n EnvUtil.currentHost() + Matter.URL_MATTER_ZIP + \"?uuids=\" + uuidsString\r\n );\r\n }\r\n\r\n constructor(reactComponent?: React.Component) {\r\n super(reactComponent);\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n this.assignEntity(\"parent\", Matter);\r\n this.assignEntity(\"visitTime\", Date);\r\n this.assignEntity(\"deleteTime\", Date);\r\n }\r\n\r\n getForm(): any {\r\n return {\r\n userUuid: this.userUuid,\r\n puuid: this.puuid,\r\n uuid: this.uuid ? this.uuid : null,\r\n dir: this.dir,\r\n alien: this.alien,\r\n name: this.name,\r\n md5: this.md5,\r\n size: this.size,\r\n privacy: this.privacy,\r\n path: this.path,\r\n times: this.times,\r\n parent: this.parent,\r\n };\r\n }\r\n\r\n getFilters(): Filter[] {\r\n return [\r\n ...super.getFilters(),\r\n new InputFilter(\"父级菜单uuid\", \"puuid\", null, false),\r\n new InputFilter(\"用户\", \"userUuid\", null, false),\r\n new InputFilter(\"关键字\", \"name\"),\r\n new CheckFilter(\"文件夹\", \"dir\"),\r\n new CheckFilter(\"应用数据\", \"alien\"),\r\n new CheckFilter(\"删除\", \"deleted\"),\r\n new SortFilter(\"文件夹\", \"orderDir\"),\r\n new SortFilter(\"下载次数\", \"orderTimes\"),\r\n new SortFilter(\"大小\", \"orderSize\"),\r\n new SortFilter(\"名称\", \"orderName\"),\r\n new InputFilter(\"后缀名\", \"extensions\"),\r\n new InputFilter(\"分享uuid\", \"shareUuid\"),\r\n new InputFilter(\"提取码\", \"shareCode\"),\r\n new InputFilter(\"分享根目录\", \"shareRootUuid\"),\r\n new SortFilter(\"删除时间排序\", \"orderDeleteTime\"),\r\n ];\r\n }\r\n\r\n getUrlPrefix() {\r\n return \"/api/matter\";\r\n }\r\n\r\n isImage() {\r\n return FileUtil.isImage(this.name);\r\n }\r\n\r\n isPdf() {\r\n return FileUtil.isPdf(this.name);\r\n }\r\n\r\n isText() {\r\n return FileUtil.isText(this.name);\r\n }\r\n\r\n isDoc() {\r\n return FileUtil.isDoc(this.name);\r\n }\r\n\r\n isPpt() {\r\n return FileUtil.isPpt(this.name);\r\n }\r\n\r\n isXls() {\r\n return FileUtil.isXls(this.name);\r\n }\r\n\r\n isAudio() {\r\n return FileUtil.isAudio(this.name);\r\n }\r\n\r\n isVideo() {\r\n return FileUtil.isVideo(this.name);\r\n }\r\n\r\n isPsd() {\r\n return FileUtil.isPsd(this.name);\r\n }\r\n\r\n getIcon() {\r\n if (FileUtil.isImage(this.name)) {\r\n return ImageUtil.handleImageUrl(this.getPreviewUrl(), false, 100, 100);\r\n } else {\r\n return FileUtil.getIcon(this.name, this.dir);\r\n }\r\n }\r\n\r\n //下载文件\r\n download(downloadUrl?: string | null) {\r\n if (!downloadUrl) {\r\n downloadUrl = this.getDownloadUrl();\r\n }\r\n window.open(downloadUrl);\r\n }\r\n\r\n //预览文件 在分享的预览中才主动传入previewUrl.\r\n preview(previewUrl?: string | null) {\r\n let shareMode = true;\r\n if (previewUrl) {\r\n shareMode = true;\r\n } else {\r\n shareMode = false;\r\n previewUrl = this.getPreviewUrl();\r\n }\r\n\r\n if (this.isImage()) {\r\n ImagePreviewer.showSinglePhoto(previewUrl);\r\n } else {\r\n if (shareMode) {\r\n PreviewerHelper.preview(this, previewUrl);\r\n } else {\r\n PreviewerHelper.preview(this);\r\n }\r\n }\r\n }\r\n\r\n httpCreateDirectory(\r\n successCallback?: any,\r\n errorCallback?: any,\r\n finallyCallback?: any\r\n ) {\r\n let that = this;\r\n let form = { userUuid: that.userUuid, name: that.name, puuid: that.puuid };\r\n\r\n return this.httpPost(\r\n Matter.URL_MATTER_CREATE_DIRECTORY,\r\n form,\r\n function (response: any) {\r\n that.assign(response.data.data);\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback,\r\n finallyCallback\r\n );\r\n }\r\n\r\n httpSoftDelete(successCallback?: any, errorCallback?: any) {\r\n this.httpPost(\r\n Matter.URL_MATTER_SOFT_DELETE,\r\n { uuid: this.uuid },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpSoftDeleteBatch(\r\n uuids: string,\r\n successCallback?: any,\r\n errorCallback?: any\r\n ) {\r\n this.httpPost(\r\n Matter.URL_MATTER_SOFT_DELETE_BATCH,\r\n { uuids: uuids },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpDelete(successCallback?: any, errorCallback?: any) {\r\n this.httpPost(\r\n Matter.URL_MATTER_DELETE,\r\n { uuid: this.uuid },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpDeleteBatch(uuids: string, successCallback?: any, errorCallback?: any) {\r\n this.httpPost(\r\n Matter.URL_MATTER_DELETE_BATCH,\r\n { uuids: uuids },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpRecovery(successCallback?: any, errorCallback?: any) {\r\n this.httpPost(\r\n Matter.URL_MATTER_RECOVERY,\r\n { uuid: this.uuid },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpRecoveryBatch(uuids: string, successCallback?: any, errorCallback?: any) {\r\n this.httpPost(\r\n Matter.URL_MATTER_RECOVERY_BATCH,\r\n { uuids: uuids },\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpRename(\r\n name: string,\r\n successCallback?: any,\r\n errorCallback?: any,\r\n finallyCallback?: any\r\n ) {\r\n let that = this;\r\n this.httpPost(\r\n Matter.URL_MATTER_RENAME,\r\n { uuid: this.uuid, name: name },\r\n function (response: any) {\r\n that.assign(response.data.data);\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback,\r\n finallyCallback\r\n );\r\n }\r\n\r\n httpChangePrivacy(\r\n privacy: boolean,\r\n successCallback?: any,\r\n errorCallback?: any\r\n ) {\r\n let that = this;\r\n this.httpPost(\r\n Matter.URL_CHANGE_PRIVACY,\r\n { uuid: this.uuid, privacy: privacy },\r\n function (response: any) {\r\n that.privacy = privacy;\r\n if (typeof successCallback === \"function\") {\r\n successCallback(response);\r\n message.success(response.data.msg);\r\n } else {\r\n message.success(response.data.msg);\r\n }\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpMove(\r\n srcUuids: string,\r\n destUuid: string,\r\n successCallback?: any,\r\n errorCallback?: any\r\n ) {\r\n let form: any = { srcUuids: srcUuids };\r\n if (destUuid) {\r\n form.destUuid = destUuid;\r\n } else {\r\n form.destUuid = \"root\";\r\n }\r\n this.httpPost(\r\n Matter.URL_MATTER_MOVE,\r\n form,\r\n function (response: any) {\r\n typeof successCallback === \"function\" && successCallback(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n /*\r\n 以下是和上传相关的内容。\r\n */\r\n\r\n //从file中装填metaData\r\n validate() {\r\n if (!this.file) {\r\n this.errorMessage = \"请选择上传文件\";\r\n return false;\r\n }\r\n\r\n this.name = this.file.name;\r\n if (!this.name) {\r\n this.errorMessage = \"请选择上传文件\";\r\n return false;\r\n }\r\n\r\n this.size = this.file.size;\r\n\r\n this.errorMessage = null;\r\n return true;\r\n }\r\n\r\n //验证过滤器有没有误填写,这个方法主要给开发者使用。\r\n validateFilter() {\r\n let filter = this.filter;\r\n if (filter === null || filter === \"\") {\r\n this.errorMessage = \"过滤器设置错误,请检查-1\";\r\n console.error(\"过滤器设置错误,请检查.-1\");\r\n return false;\r\n }\r\n if (filter !== \"*\") {\r\n let regex1 = /^(image|audio|video|text)(\\|(image|audio|video|text))*$/g;\r\n let regex2 = /^(\\.[\\w]+)(\\|\\.[\\w]+)*$/;\r\n // 测试几种特殊类型 image|audio|video|text\r\n\r\n if (!regex1.test(filter)) {\r\n //测试后缀名\r\n if (!regex2.test(filter)) {\r\n this.errorMessage = \"过滤器设置错误,请检查-2\";\r\n console.error(\"过滤器设置错误,请检查.-2\");\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n //validate privacy\r\n let privacy = this.privacy;\r\n if (!privacy) {\r\n if (privacy !== false) {\r\n this.errorMessage = \"privacy属性为Boolean类型\";\r\n console.error(\"privacy属性为Boolean类型.\");\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //验证用户上传的文件是否符合过滤器\r\n validateFileType() {\r\n if (!this.filter) {\r\n this.errorMessage = \"该过滤条件有问题\";\r\n return false;\r\n }\r\n if (this.filter === \"*\") {\r\n this.errorMessage = null;\r\n return true;\r\n }\r\n\r\n let type = MimeUtil.getMimeType(this.name);\r\n let extension = MimeUtil.getExtension(this.name);\r\n let simpleType = type.substring(0, type.indexOf(\"/\"));\r\n\r\n //专门解决android微信浏览器中名字乱命名的bug.\r\n if (StringUtil.startWith(this.name, \"image%3A\")) {\r\n extension = \"jpg\";\r\n simpleType = \"image\";\r\n } else if (StringUtil.startWith(this.name, \"video%3A\")) {\r\n extension = \"mp4\";\r\n simpleType = \"video\";\r\n } else if (StringUtil.startWith(this.name, \"audio%3A\")) {\r\n extension = \"mp3\";\r\n simpleType = \"audio\";\r\n }\r\n\r\n if (StringUtil.containStr(this.filter, extension)) {\r\n this.errorMessage = null;\r\n return true;\r\n }\r\n\r\n if (simpleType) {\r\n if (StringUtil.containStr(this.filter, simpleType)) {\r\n this.errorMessage = null;\r\n return true;\r\n }\r\n }\r\n this.errorMessage = \"您上传的文件格式不符合要求\";\r\n return false;\r\n }\r\n\r\n //文件上传\r\n httpUpload(successCallback?: any, failureCallback?: any) {\r\n let that = this;\r\n\r\n //验证是否装填好\r\n if (!this.validate()) {\r\n return;\r\n }\r\n\r\n //验证用户填写的过滤条件是否正确\r\n if (!this.validateFilter()) {\r\n return;\r\n }\r\n\r\n //验证是否满足过滤器\r\n if (!this.validateFileType()) {\r\n MessageBoxUtil.error(\"文件类型不满足,请重试\");\r\n return;\r\n }\r\n\r\n //(兼容性:chrome,ff,IE9及以上)\r\n let formData = new FormData();\r\n\r\n formData.append(\"userUuid\", that.userUuid);\r\n formData.append(\"puuid\", that.puuid);\r\n formData.append(\"file\", that.file!);\r\n formData.append(\"alien\", that.alien.toString());\r\n formData.append(\"privacy\", that.privacy.toString());\r\n\r\n //闭包\r\n let lastTimeStamp = new Date().getTime();\r\n let lastSize = 0;\r\n\r\n that.loading = true;\r\n\r\n HttpUtil.httpPostFile(\r\n Matter.URL_MATTER_UPLOAD,\r\n formData,\r\n function (response: any) {\r\n that.uuid = response.data.data.uuid;\r\n SafeUtil.safeCallback(successCallback)(response);\r\n },\r\n function (err: any) {\r\n if (axios.isCancel(err)) {\r\n that.clear();\r\n SafeUtil.safeCallback(failureCallback)();\r\n return;\r\n }\r\n const response = err.response;\r\n that.errorMessage = response;\r\n that.clear();\r\n that.defaultErrorHandler(response);\r\n SafeUtil.safeCallback(failureCallback)(that.getErrorMessage(response));\r\n },\r\n function () {\r\n that.loading = false;\r\n },\r\n function (event) {\r\n //上传进度。\r\n that.progress = event.loaded / event.total;\r\n\r\n let currentTime = new Date().getTime();\r\n let deltaTime = currentTime - lastTimeStamp;\r\n\r\n //每1s计算一次速度\r\n if (deltaTime > 1000) {\r\n lastTimeStamp = currentTime;\r\n\r\n let currentSize = event.loaded;\r\n let deltaSize = currentSize - lastSize;\r\n lastSize = currentSize;\r\n\r\n that.speed = NumberUtil.parseInt(\r\n (deltaSize / (deltaTime / 1000)).toFixed(0)\r\n );\r\n }\r\n that.updateUI();\r\n },\r\n {\r\n cancelToken: that.cancelSource.token,\r\n }\r\n );\r\n }\r\n\r\n cancelUpload() {\r\n this.cancelSource.cancel();\r\n }\r\n\r\n //清除文件\r\n clear() {\r\n //filter,privacy不变\r\n let matter = new Matter();\r\n matter.filter = this.filter;\r\n matter.privacy = this.privacy;\r\n matter.errorMessage = this.errorMessage;\r\n matter.uploadHint = this.uploadHint;\r\n this.assign(matter);\r\n }\r\n\r\n getPreviewUrl(downloadTokenUuid?: string): string {\r\n return `${EnvUtil.currentHost()}/api/alien/preview/${this.uuid}/${\r\n this.name\r\n }${downloadTokenUuid ? \"?downloadTokenUuid=\" + downloadTokenUuid : \"\"}`;\r\n }\r\n\r\n getDownloadUrl(downloadTokenUuid?: string): string {\r\n return `${EnvUtil.currentHost()}/api/alien/download/${this.uuid}/${\r\n this.name\r\n }${downloadTokenUuid ? \"?downloadTokenUuid=\" + downloadTokenUuid : \"\"}`;\r\n }\r\n\r\n getShareDownloadUrl(\r\n shareUuid: string,\r\n shareCode: string,\r\n shareRootUuid: string\r\n ): string {\r\n return `${EnvUtil.currentHost()}/api/alien/download/${this.uuid}/${\r\n this.name\r\n }?shareUuid=${shareUuid}&shareCode=${shareCode}&shareRootUuid=${shareRootUuid}`;\r\n }\r\n\r\n getSharePreviewUrl(\r\n shareUuid: string,\r\n shareCode: string,\r\n shareRootUuid: string\r\n ): string {\r\n return `${EnvUtil.currentHost()}/api/alien/preview/${this.uuid}/${\r\n this.name\r\n }?shareUuid=${shareUuid}&shareCode=${shareCode}&shareRootUuid=${shareRootUuid}`;\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport StringUtil from \"../../../common/util/StringUtil\";\r\nimport { Progress } from \"antd\";\r\nimport { CloseOutlined } from \"@ant-design/icons\";\r\nimport \"./UploadMatterPanel.less\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n matter: Matter;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class UploadMatterPanel extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n format = (percent: number) => {\r\n return `${percent.toFixed(1)}%`;\r\n };\r\n\r\n componentDidMount() {\r\n this.props.matter.reactComponent = this;\r\n }\r\n\r\n componentWillReceiveProps(nextProps: Readonly, nextContext: any) {}\r\n componentWillUnmount() {\r\n this.props.matter.reactComponent = null;\r\n }\r\n\r\n render() {\r\n const { matter } = this.props;\r\n return (\r\n
\r\n {matter.loading ? (\r\n
\r\n
\r\n
{matter.file!.name}
\r\n
\r\n matter.cancelUpload()} />\r\n
\r\n
\r\n this.format(matter.progress * 100)}\r\n percent={matter.progress * 100}\r\n status=\"active\"\r\n />\r\n
\r\n {`${Lang.t(\"matter.uploaded\")}: ${StringUtil.humanFileSize(\r\n matter.file!.size * matter.progress\r\n )}/${StringUtil.humanFileSize(matter.file!.size)} ${\r\n matter.progress < 1\r\n ? `${Lang.t(\"matter.speed\")}:${StringUtil.humanFileSize(\r\n matter.speed\r\n )}s`\r\n : Lang.t(\"matter.finishingTip\")\r\n }`}\r\n
\r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport Moon from \"../../../common/model/global/Moon\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport ImagePreviewer from \"../../widget/previewer/ImagePreviewer\";\r\nimport { Input, Upload, Button } from \"antd\";\r\nimport UploadMatterPanel from \"./UploadMatterPanel\";\r\nimport \"./MatterImage.less\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n value?: string;\r\n onChange?: (value: string) => any;\r\n preview?: boolean; //上传的照片是否需要预览\r\n previewWidth?: number;\r\n filter?: string;\r\n uploadHint?: string;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class MatterImage extends TankComponent {\r\n // 是否手动上传模式\r\n manual = false;\r\n matter = new Matter(this);\r\n user = Moon.getSingleton().user;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n changeLink = (e: any) => {\r\n SafeUtil.safeCallback(this.props.onChange)(e.target.value);\r\n };\r\n\r\n triggerUpload = (fileObj: any) => {\r\n const { file } = fileObj;\r\n const { filter = \"image\", uploadHint = \"\" } = this.props;\r\n if (file) {\r\n if (this.user.sizeLimit >= 0 && file.size > this.user.sizeLimit) {\r\n MessageBoxUtil.error(\r\n Lang.t(\"matter.sizeExceedLimit\", file.size, this.user.sizeLimit)\r\n );\r\n return;\r\n }\r\n this.matter.assign({\r\n uploadHint,\r\n filter,\r\n file,\r\n puuid: \"root\",\r\n privacy: false,\r\n dir: false,\r\n alien: true,\r\n userUuid: this.user.uuid,\r\n });\r\n this.matter.httpUpload(\r\n () => {\r\n SafeUtil.safeCallback(this.props.onChange)(\r\n this.matter.getPreviewUrl()\r\n );\r\n this.matter = new Matter();\r\n this.updateUI();\r\n },\r\n () => this.updateUI()\r\n );\r\n }\r\n };\r\n\r\n toggleHandle = () => {\r\n this.manual = !this.manual;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { manual, matter } = this;\r\n const {\r\n value,\r\n preview = true,\r\n previewWidth = 200,\r\n uploadHint,\r\n } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n {preview && value ? (\r\n ImagePreviewer.showSinglePhoto(value)}\r\n />\r\n ) : null}\r\n
\r\n
\r\n {manual ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n {uploadHint ?
{uploadHint}
: null}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport {RouteComponentProps} from \"react-router-dom\";\r\nimport \"./Edit.less\"\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport {Button, Form, Input, InputNumber, Select} from 'antd';\r\nimport User from \"../../common/model/user/User\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport FileUtil from \"../../common/util/FileUtil\";\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport {FormInstance} from \"antd/lib/form\";\r\nimport {SaveOutlined} from \"@ant-design/icons/lib\";\r\nimport {UserRole, UserRoleList} from \"../../common/model/user/UserRole\";\r\nimport ColorSelectionOption from \"../../common/model/base/option/ColorSelectionOption\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport MatterImage from \"../matter/widget/MatterImage\";\r\n\r\n\r\ninterface RouteParam {\r\n uuid: string\r\n}\r\n\r\n\r\ninterface IProps extends RouteComponentProps {\r\n\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class Edit extends TankComponent {\r\n\r\n formRef = React.createRef();\r\n\r\n createMode: boolean = false\r\n\r\n //登录的那个用户\r\n user: User = Moon.getSingleton().user\r\n\r\n //当前页面正在编辑的用户\r\n currentUser: User = new User(this)\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n this.currentUser.role = UserRole.USER\r\n }\r\n\r\n componentDidMount() {\r\n let match = this.props.match;\r\n\r\n if (match.params.uuid) {\r\n this.createMode = false;\r\n this.currentUser.uuid = match.params.uuid;\r\n this.currentUser.httpDetail();\r\n } else {\r\n this.createMode = true;\r\n this.updateUI()\r\n }\r\n\r\n }\r\n\r\n onFinish(values: any) {\r\n\r\n\r\n let that = this\r\n\r\n let user: User = this.user\r\n let currentUser: User = this.currentUser\r\n\r\n currentUser.assign(values)\r\n\r\n currentUser.httpSave(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"))\r\n\r\n //如果是自己的资料修改成功,更新一下本地。\r\n if (user.uuid === currentUser.uuid) {\r\n user.assign(currentUser)\r\n }\r\n\r\n Sun.navigateBack()\r\n })\r\n\r\n };\r\n\r\n onFinishFailed(errorInfo: any) {\r\n\r\n };\r\n\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n let user: User = this.user\r\n let currentUser: User = this.currentUser\r\n\r\n const layout = {\r\n labelCol: {span: 6},\r\n wrapperCol: {span: 18},\r\n };\r\n\r\n //当前是否为编辑自己的模式。\r\n let editSelf: boolean = false\r\n if (!this.createMode && user.uuid === currentUser.uuid) {\r\n editSelf = true\r\n }\r\n\r\n //是否可以编辑角色。\r\n let roleEditable: boolean = false\r\n if (this.createMode || (user.uuid !== currentUser.uuid && user.role === UserRole.ADMINISTRATOR)) {\r\n roleEditable = true\r\n }\r\n\r\n return (\r\n\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n {\r\n that.updateUI()\r\n }}\r\n >\r\n {editSelf && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n {\r\n this.createMode && (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n {\r\n this.createMode && (\r\n ({\r\n validator(rule, value) {\r\n if (!value || getFieldValue('password') === value) {\r\n return Promise.resolve();\r\n }\r\n return Promise.reject(Lang.t(\"user.passwordNotSame\"));\r\n },\r\n }),\r\n ]}\r\n >\r\n \r\n \r\n )\r\n }\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {Lang.t(\"user.current\")}:\r\n {(this.formRef && this.formRef.current) ?\r\n FileUtil.humanFileSize(this.formRef.current.getFieldValue(\"sizeLimit\"))\r\n : FileUtil.humanFileSize(currentUser.sizeLimit)}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {Lang.t(\"user.current\")}:\r\n {(this.formRef && this.formRef.current) ?\r\n FileUtil.humanFileSize(this.formRef.current.getFieldValue(\"totalSizeLimit\"))\r\n : FileUtil.humanFileSize(currentUser.totalSizeLimit)}\r\n \r\n \r\n\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\nimport {RouteComponentProps} from \"react-router-dom\";\nimport \"./Edit.less\"\nimport TankComponent from \"../../common/component/TankComponent\";\nimport User from \"../../common/model/user/User\";\nimport Moon from \"../../common/model/global/Moon\";\nimport Lang from \"../../common/model/global/Lang\";\n\n\ninterface RouteParam {\n authentication: string\n}\n\n\ninterface IProps extends RouteComponentProps {\n\n}\n\ninterface IState {\n\n}\n\nexport default class Authentication extends TankComponent {\n\n //登录的那个用户\n user: User = Moon.getSingleton().user\n\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n let match = this.props.match;\n\n\n\n this.user.httpAuthenticationLogin(match.params.authentication, function () {\n //转跳到首页\n //Sun.navigateTo(\"/\")\n window.location.href = \"/\"\n })\n }\n\n render() {\n\n let that = this\n\n let user: User = this.user\n\n return (\n
\n {Lang.t(\"user.redirecting\")}\n
\n );\n }\n}\n\n\n","import \"./PreviewEngineCell.less\";\nimport React from \"react\";\nimport PreviewEngine from \"../../../common/model/preference/model/PreviewEngine\";\nimport {Tag, Tooltip} from \"antd\";\nimport Lang from \"../../../common/model/global/Lang\";\nimport InfoCell from \"../../widget/InfoCell\";\n\ninterface IProps {\n engine: PreviewEngine;\n order?: number; // 从1开始\n}\n\nexport default function PreviewEngineCell(props: IProps) {\n const {engine, order} = props;\n\n return (\n
\n
\n

\n {order ? Lang.t(\"preference.previewEngine\", order) : Lang.t(\"preference.defaultPreview\")}\n

\n \n {engine.url === '{originUrl}' ? '{url}' : engine.url}\n \n \n {engine.extensions}\n \n
\n
\n {\n order ? null : (\n \n \n {Lang.t(\"preference.defaultPreview\")}\n \n \n )\n }\n \n {engine.previewInSite ? (\n \n {Lang.t(\"preference.previewCurrent\")}\n \n ) : (\n \n {Lang.t(\"preference.previewOpen\")}\n \n )}\n \n
\n\n
\n );\n}\n","import React, {Children} from \"react\";\nimport {Link, RouteComponentProps} from \"react-router-dom\";\nimport \"./Index.less\";\nimport TankComponent from \"../../common/component/TankComponent\";\nimport User from \"../../common/model/user/User\";\nimport Moon from \"../../common/model/global/Moon\";\nimport TankTitle from \"../widget/TankTitle\";\nimport {Button, Divider, Empty, Tag, Tooltip, message} from \"antd\";\nimport {\n EditOutlined,\n ThunderboltOutlined,\n ScanOutlined,\n} from \"@ant-design/icons\";\nimport InfoCell from \"../widget/InfoCell\";\nimport Preference from \"../../common/model/preference/Preference\";\nimport TankContentCard from \"../widget/TankContentCard\";\nimport FileUtil from \"../../common/util/FileUtil\";\nimport ImagePreviewer from \"../widget/previewer/ImagePreviewer\";\nimport Lang from \"../../common/model/global/Lang\";\nimport SingleTextModal from \"../widget/SingleTextModal\";\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\nimport {\n ScanScopeType,\n ScanScopeTypeMap,\n} from \"../../common/model/preference/model/ScanScopeType\";\nimport PreviewEngineCell from \"./widget/PreviewEngineCell\";\nimport PreviewEngine from \"../../common/model/preference/model/PreviewEngine\";\n\ninterface IProps extends RouteComponentProps {\n}\n\ninterface IState {\n}\n\nexport default class Index extends TankComponent {\n user: User = Moon.getSingleton().user;\n\n preference: Preference = Moon.getSingleton().preference;\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n this.refresh();\n }\n\n //refresh preference.\n refresh() {\n let that = this;\n\n that.preference.httpFetch(function () {\n that.updateUI();\n });\n }\n\n cleanup() {\n let that = this;\n let preference = this.preference;\n\n SingleTextModal.open(\n Lang.t(\"preference.systemCleanupPrompt\"),\n \"\",\n function (text: string) {\n preference.httpSystemCleanup(text, function () {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n });\n }\n );\n }\n\n\n immediateScan() {\n const hide = message.loading(Lang.t(\"preference.scanLoading\"), 0);\n this.preference.httpScanOnce(\n () => {\n message.success(Lang.t(\"operationSuccess\"));\n },\n null,\n hide\n );\n }\n\n render() {\n const {\n previewConfig: {previewEngines},\n scanConfig,\n } = this.preference;\n\n return (\n
\n \n }\n >\n {Lang.t(\"preference.systemCleanup\")}\n \n \n\n \n
\n
\n

{Lang.t(\"preference.basic\")}

\n \n \n \n
\n \n {this.preference.name}\n \n\n \n {this.preference.logoUrl && (\n {\n ImagePreviewer.showSinglePhoto(this.preference.logoUrl!);\n }}\n />\n )}\n \n\n \n {this.preference.faviconUrl && (\n {\n ImagePreviewer.showSinglePhoto(this.preference.faviconUrl!);\n }}\n />\n )}\n \n\n \n \n \n\n \n \n \n\n \n {this.preference.downloadDirMaxNum === -1\n ? Lang.t(\"preference.noLimit\")\n : this.preference.downloadDirMaxNum}\n \n\n \n {FileUtil.humanFileSize(this.preference.downloadDirMaxSize)}\n \n\n \n {FileUtil.humanFileSize(this.preference.defaultTotalSizeLimit)}\n \n\n \n {this.preference.deletedKeepDays} 天\n \n\n \n {this.preference.allowRegister ? Lang.t(\"yes\") : Lang.t(\"no\")}\n \n\n \n \n https://tank-doc.eyeblue.cn/zh\n \n \n
\n\n \n\n
\n
\n

{Lang.t(\"preference.preview\")}

\n \n \n \n
\n
\n {previewEngines.map((engine, index) => (\n \n ))}\n {Children.toArray(\n PreviewEngine.defaultPreviewEngines().map((engine) => (\n \n ))\n )}\n
\n
\n\n \n\n
\n
\n

{Lang.t(\"preference.scan\")}

\n
\n {scanConfig.enable ? (\n }\n onClick={() => this.immediateScan()}\n >\n 立即扫描\n ) : \"\"}\n\n \n \n \n
\n
\n
\n {scanConfig.enable ? (\n <>\n \n {scanConfig.cron}\n \n \n {ScanScopeTypeMap[scanConfig.scope].name}\n \n {scanConfig.scope === ScanScopeType.CUSTOM && (\n \n {scanConfig.usernames.join(\", \")}\n \n )}\n \n ) : (\n \n )}\n
\n
\n
\n
\n );\n }\n}\n","import React from \"react\";\r\nimport {RouteComponentProps} from \"react-router-dom\";\r\nimport \"./Edit.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport User from \"../../common/model/user/User\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport {Button, Form, Input, InputNumber, Switch} from \"antd\";\r\nimport {SaveOutlined} from \"@ant-design/icons\";\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport Preference from \"../../common/model/preference/Preference\";\r\nimport FileUtil from \"../../common/util/FileUtil\";\r\nimport {FormInstance} from \"antd/lib/form\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport MatterImage from \"../matter/widget/MatterImage\";\r\n\r\ninterface IProps extends RouteComponentProps {\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class Edit extends TankComponent {\r\n formRef = React.createRef();\r\n\r\n user: User = Moon.getSingleton().user;\r\n preference: Preference = Moon.getSingleton().preference;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.preference.detailLoading = true;\r\n }\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n that.refreshPreference();\r\n }\r\n\r\n refreshPreference() {\r\n let that = this;\r\n\r\n that.preference.httpFetch(function () {\r\n that.preference.detailLoading = false;\r\n that.updateUI();\r\n });\r\n }\r\n\r\n onFinish(values: any) {\r\n\r\n\r\n let that = this;\r\n\r\n let user = that.user;\r\n\r\n that.preference.assign(values);\r\n\r\n that.preference.httpSave(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n\r\n Sun.updateFrame();\r\n\r\n Sun.navigateTo(\"/preference/index\");\r\n });\r\n }\r\n\r\n onFinishFailed(errorInfo: any) {\r\n\r\n }\r\n\r\n render() {\r\n let that = this;\r\n\r\n let preference = that.preference;\r\n\r\n const layout = {\r\n labelCol: {span: 6},\r\n wrapperCol: {span: 18},\r\n };\r\n\r\n let initialValues: any = preference.getForm();\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n that.updateUI()}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {Lang.t(\"preference.current\")}:\r\n {this.formRef && this.formRef.current\r\n ? FileUtil.humanFileSize(\r\n this.formRef.current.getFieldValue(\"downloadDirMaxSize\")\r\n )\r\n : FileUtil.humanFileSize(preference.defaultTotalSizeLimit)}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {Lang.t(\"preference.current\")}:\r\n {this.formRef && this.formRef.current\r\n ? FileUtil.humanFileSize(\r\n this.formRef.current.getFieldValue(\r\n \"defaultTotalSizeLimit\"\r\n )\r\n )\r\n : FileUtil.humanFileSize(preference.defaultTotalSizeLimit)}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {Lang.t(\"preference.matterBinDefaultTip\")}\r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport \"./PreviewEngineEditCell.less\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport PreviewEngine from \"../../../common/model/preference/model/PreviewEngine\";\r\nimport { DeleteOutlined } from \"@ant-design/icons\";\r\nimport { Form, Input, Switch, Tooltip } from \"antd\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport { QuestionCircleOutlined } from \"@ant-design/icons\";\r\n\r\ninterface IProps {\r\n previewEngine: PreviewEngine;\r\n index: number;\r\n onDelete: () => void;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class PreviewEngineEditCell extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const { previewEngine } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n {Lang.t(\"preference.engine\", this.props.index + 1)}\r\n \r\n {\r\n this.props.onDelete();\r\n }}\r\n />\r\n \r\n
\r\n
\r\n \r\n
\r\n {Lang.t(\"preference.engineReg\")}\r\n \r\n
\r\n \r\n }\r\n rules={[\r\n { required: true, message: Lang.t(\"preference.engineRegHelper\") },\r\n ]}\r\n >\r\n {\r\n previewEngine.url = e.target.value;\r\n this.updateUI();\r\n }}\r\n />\r\n \r\n\r\n \r\n
\r\n {Lang.t(\"preference.engineSuffix\")}\r\n \r\n
\r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: Lang.t(\"preference.engineSuffixPlaceHolder\"),\r\n },\r\n ]}\r\n >\r\n {\r\n previewEngine.extensions = e.target.value;\r\n this.updateUI();\r\n }}\r\n />\r\n \r\n\r\n \r\n
\r\n {Lang.t(\"preference.previewCurrent\")}\r\n \r\n
\r\n \r\n }\r\n >\r\n {\r\n previewEngine.previewInSite = val;\r\n this.updateUI();\r\n }}\r\n />\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport \"./PreviewConfigPanel.less\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport PreviewConfig from \"../../../common/model/preference/model/PreviewConfig\";\r\nimport PreviewEngine from \"../../../common/model/preference/model/PreviewEngine\";\r\nimport PreviewEngineEditCell from \"./PreviewEngineEditCell\";\r\nimport { Button } from \"antd\";\r\nimport { PlusOutlined } from \"@ant-design/icons\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n previewConfig: PreviewConfig;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class PreviewConfigPanel extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n addEngine = () => {\r\n let previewConfig: PreviewConfig = this.props.previewConfig;\r\n\r\n let engine: PreviewEngine = new PreviewEngine();\r\n\r\n previewConfig.previewEngines.push(engine);\r\n\r\n this.updateUI();\r\n };\r\n\r\n delEngineCell = (index: number) => {\r\n this.props.previewConfig.previewEngines.splice(index, 1);\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { previewConfig } = this.props;\r\n\r\n return (\r\n
\r\n {previewConfig.previewEngines.map(\r\n (previewEngine: PreviewEngine, index: number) => {\r\n return (\r\n {\r\n this.delEngineCell(index);\r\n }}\r\n />\r\n );\r\n }\r\n )}\r\n\r\n }\r\n onClick={this.addEngine.bind(this)}\r\n >\r\n {Lang.t(\"preference.newEngine\")}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\nimport {RouteComponentProps} from \"react-router-dom\";\nimport \"./PreviewEngineEdit.less\";\nimport TankComponent from \"../../common/component/TankComponent\";\nimport Preference from \"../../common/model/preference/Preference\";\nimport Moon from \"../../common/model/global/Moon\";\nimport Lang from \"../../common/model/global/Lang\";\nimport TankTitle from \"../widget/TankTitle\";\nimport TankContentCard from \"../widget/TankContentCard\";\nimport {Button, Form, Tooltip} from \"antd\";\nimport {FormInstance} from \"antd/lib/form\";\nimport {SaveOutlined} from \"@ant-design/icons\";\nimport PreviewConfigPanel from \"./widget/PreviewConfigPanel\";\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\nimport Sun from \"../../common/model/global/Sun\";\nimport {QuestionCircleOutlined} from \"@ant-design/icons/lib\";\n\ninterface IProps extends RouteComponentProps {\n}\n\ninterface IState {\n}\n\nexport default class PreviewEngineEdit extends TankComponent {\n formRef = React.createRef();\n preference: Preference = Moon.getSingleton().preference;\n\n constructor(props: IProps) {\n super(props);\n this.preference.detailLoading = true;\n }\n\n componentDidMount() {\n this.refresh();\n }\n\n refresh = () => {\n this.preference.httpFetch(() => {\n this.preference.detailLoading = false;\n this.updateUI();\n });\n };\n\n finish = (values: any) => {\n this.preference.assign(values);\n this.preference.httpSavePreviewEngine(function () {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n Sun.updateFrame();\n Sun.navigateTo(\"/preference/index\");\n });\n };\n\n render() {\n const {preference} = this;\n const layout = {\n labelCol: {span: 6},\n wrapperCol: {span: 18},\n };\n\n return (\n
\n \n \n \n \n
\n {Lang.t(\"preference.previewConfig\")}\n \n
\n }>\n \n
\n
\n \n
\n \n
\n
\n );\n }\n}\n","import React from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport \"./ScanEdit.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport Preference from \"../../common/model/preference/Preference\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport { Button, Form, Input, Select, Spin, Switch } from \"antd\";\r\nimport { FormInstance } from \"antd/lib/form\";\r\nimport { SaveOutlined } from \"@ant-design/icons\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport {\r\n ScanScopeType,\r\n ScanScopeTypeList,\r\n} from \"../../common/model/preference/model/ScanScopeType\";\r\nimport {\r\n ScanCronType,\r\n ScanCronTypeList,\r\n ScanCronTypeValueList,\r\n} from \"../../common/model/preference/model/ScanCronType\";\r\nimport Pager from \"../../common/model/base/Pager\";\r\nimport User from \"../../common/model/user/User\";\r\nimport SortDirection from \"../../common/model/base/SortDirection\";\r\n\r\ninterface IProps extends RouteComponentProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class ScanEdit extends TankComponent {\r\n formRef = React.createRef();\r\n\r\n preference: Preference = Moon.getSingleton().preference;\r\n pager: Pager = new Pager(this, User, 10);\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.preference.detailLoading = true;\r\n }\r\n\r\n componentDidMount() {\r\n this.preference.httpFetch(() => {\r\n this.preference.detailLoading = false;\r\n\r\n // 给前端辅助字段赋值\r\n this.preference.scanConfig.cronType = this.preference.scanConfig.cron;\r\n if (\r\n !ScanCronTypeValueList.includes(this.preference.scanConfig.cronType!)\r\n ) {\r\n this.preference.scanConfig.cronType = ScanCronType.CUSTOM;\r\n }\r\n\r\n if (this.preference.scanConfig.scope !== ScanScopeType.ALL) {\r\n this.preference.scanConfig.users = this.preference.scanConfig.usernames.map(\r\n (name: string) => ({\r\n label: name,\r\n value: name,\r\n })\r\n );\r\n }\r\n\r\n this.updateUI();\r\n });\r\n }\r\n\r\n finish = (values: any) => {\r\n if (values.scope === ScanScopeType.CUSTOM) {\r\n this.preference.scanConfig.assign({\r\n ...values,\r\n usernames: values.users.map((item: any) => item.value),\r\n });\r\n } else {\r\n this.preference.scanConfig.assign(values);\r\n }\r\n\r\n this.preference.httpSaveScan(function () {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n Sun.updateFrame();\r\n Sun.navigateTo(\"/preference/index\");\r\n });\r\n };\r\n\r\n changeEnableScan = (value: boolean) => {\r\n this.preference.scanConfig.enable = value;\r\n this.updateUI();\r\n };\r\n\r\n changeCronType = (value: ScanCronType) => {\r\n this.preference.scanConfig.cronType = value;\r\n this.updateUI();\r\n };\r\n\r\n changeScopeType = (value: ScanScopeType) => {\r\n this.preference.scanConfig.scope = value;\r\n this.updateUI();\r\n };\r\n\r\n fetchUser = (value: any) => {\r\n this.pager.resetFilter();\r\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\r\n this.pager.setFilterValue(\"username\", value);\r\n this.pager.httpList();\r\n };\r\n\r\n render() {\r\n const { preference, pager } = this;\r\n\r\n const layout = {\r\n labelCol: { span: 6 },\r\n wrapperCol: { span: 18 },\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n this.updateUI}\r\n >\r\n \r\n \r\n \r\n {preference.scanConfig.enable && (\r\n <>\r\n \r\n \r\n \r\n {preference.scanConfig.cronType === ScanCronType.CUSTOM && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {preference.scanConfig.scope === ScanScopeType.CUSTOM && (\r\n \r\n : null\r\n }\r\n filterOption={false}\r\n onSearch={this.fetchUser}\r\n style={{ width: \"100%\" }}\r\n >\r\n {pager.data.map((user: User) => (\r\n \r\n {user.username}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n )}\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport \"./RatePanel.less\"\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport {ArrowDownOutlined, ArrowUpOutlined} from \"@ant-design/icons/lib\";\r\nimport Color from \"../../../common/model/base/option/Color\";\r\n\r\ninterface IProps {\r\n name: string\r\n standardValue: number\r\n compareValue: number\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class RatePanel extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = {}\r\n }\r\n\r\n\r\n componentDidMount() {\r\n\r\n }\r\n\r\n getValue(): number {\r\n if (this.props.standardValue === 0) {\r\n if (this.props.compareValue === 0) {\r\n return 0;\r\n } else {\r\n return 100;\r\n }\r\n } else {\r\n let v1 = this.props.compareValue - this.props.standardValue\r\n let v2 = v1 / this.props.standardValue\r\n return parseInt((v2 * 100).toFixed(0))\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n let name: string = this.props.name\r\n\r\n let noData: boolean = this.props.standardValue === 0 && this.props.compareValue === 0\r\n let infinite: boolean = this.props.standardValue === 0 && this.props.compareValue > 0\r\n let value: number = this.getValue()\r\n\r\n return (\r\n \r\n\r\n {name}\r\n\r\n {infinite ? (\r\n \r\n ) : (\r\n noData ? (\r\n - \r\n ) : (\r\n {value > 0 ? '+' : ''}{value}%\r\n )\r\n )}\r\n\r\n {\r\n (!noData && value < 0) &&\r\n ()\r\n }\r\n\r\n {\r\n (!noData && (infinite || value >= 0)) &&\r\n ()\r\n }\r\n\r\n \r\n )\r\n }\r\n}\r\n\r\n","import SafeUtil from '../../util/SafeUtil';\nimport BaseEntity from '../base/BaseEntity';\nimport Filter from \"../base/filter/Filter\";\nimport SortFilter from \"../base/filter/SortFilter\";\n\n\nexport default class Dashboard extends BaseEntity {\n\n static URL_ACTIVE_IP_TOP10 = \"/api/dashboard/active/ip/top10\"\n static URL_ETL = \"/api/dashboard/etl\"\n\n invokeNum: number = 0;\n totalInvokeNum: number = 0;\n uv: number = 0;\n totalUv: number = 0;\n matterNum: number = 0;\n totalMatterNum: number = 0;\n fileSize: number = 0;\n totalFileSize: number = 0;\n avgCost: number = 0;\n dt: string = \"\";\n\n\n constructor(reactComponent?: React.Component) {\n\n super(reactComponent);\n\n }\n\n assign(obj: any) {\n super.assign(obj);\n\n }\n\n getFilters(): Filter[] {\n return [\n ...super.getFilters(),\n new SortFilter(\"按DT排序\", \"orderDt\"),\n\n ]\n }\n\n httpActiveIpTop10(successCallback?: any, errorCallback?: any, finalCallback?: any) {\n let that = this\n this.httpPost(Dashboard.URL_ACTIVE_IP_TOP10, {}, function (response: any) {\n\n SafeUtil.safeCallback(successCallback)(response.data.data);\n\n }, errorCallback, finalCallback)\n }\n\n\n httpEtl(successCallback?: any, errorCallback?: any, finalCallback?: any) {\n let that = this\n this.httpPost(Dashboard.URL_ETL, {}, function (response: any) {\n\n SafeUtil.safeCallback(successCallback)(response.data.data);\n\n }, errorCallback, finalCallback)\n }\n\n}\n\n\n\n\n","import React from 'react';\nimport {Link, RouteComponentProps} from \"react-router-dom\";\nimport \"./Index.less\"\nimport TankComponent from \"../../common/component/TankComponent\";\nimport TankTitle from \"../widget/TankTitle\";\nimport {Alert, Col, Row} from 'antd';\nimport RatePanel from \"./widget/RatePanel\";\nimport ReactEcharts from 'echarts-for-react';\nimport Echarts from 'echarts';\nimport theme from \"./theme.json\"\nimport Pager from \"../../common/model/base/Pager\";\nimport Dashboard from '../../common/model/dashboard/Dashboard';\nimport DateUtil from '../../common/util/DateUtil';\nimport SortDirection from \"../../common/model/base/SortDirection\";\nimport FileUtil from \"../../common/util/FileUtil\";\nimport Matter from '../../common/model/matter/Matter';\nimport Lang from \"../../common/model/global/Lang\";\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\n\nEcharts.registerTheme('tank_theme', theme);\n\ninterface IProps extends RouteComponentProps {\n\n}\n\ninterface IState {\n\n}\n\ninterface IpStruct {\n ip: string\n times: number\n}\n\nexport default class Index extends TankComponent {\n\n\n //获取分页的一个帮助器\n pager: Pager = new Pager(this, Dashboard, 15);\n\n //今天的统计情况\n dashboard: Dashboard = new Dashboard(this)\n yesterdayDashboard: Dashboard = new Dashboard(this)\n\n matterPager: Pager = new Pager(this, Matter, 10);\n\n activeIpTop10: IpStruct[] = []\n\n //****************作图需要的对象******************/\n days: number = 15\n //用来存放日期的,辅助x轴的生成\n dateStrings: string[] = []\n\n //调用量周环比\n standardWeekInvokeNum: number = 0\n compareWeekInvokeNum: number = 0\n //调用量日环比\n standardDayInvokeNum: number = 0\n compareDayInvokeNum: number = 0\n //UV周环比\n standardWeekUv: number = 0\n compareWeekUv: number = 0\n //UV日环比\n standardDayUv: number = 0\n compareDayUv: number = 0\n //文件总数周环比\n standardWeekMatterNum: number = 0\n compareWeekMatterNum: number = 0\n //文件总数日环比\n standardDayMatterNum: number = 0\n compareDayMatterNum: number = 0\n //文件大小周环比\n standardWeekSize: number = 0\n compareWeekSize: number = 0\n //文件大小日环比\n standardDaySize: number = 0\n compareDaySize: number = 0\n\n invokeListOption: any = {\n tooltip: {},\n legend: {\n data: ['PV', 'UV']\n },\n xAxis: {\n name: Lang.t(\"assign.date\"),\n data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]\n },\n yAxis: {\n name: Lang.t(\"assign.num\")\n },\n series: [{\n name: 'PV',\n type: 'bar',\n data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n }, {\n name: 'UV',\n type: 'line',\n data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n }]\n };\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n\n }\n\n componentDidMount() {\n\n this.refresh()\n\n }\n\n refresh() {\n\n this.updateDateStrings()\n this.refreshDashboardPager()\n this.refreshMatterPager()\n this.refreshActiveIpTop10()\n }\n\n updateDateStrings() {\n let that = this;\n //更新横坐标 从今天开始倒推\n let arr = []\n for (let d = that.days - 1; d >= 0; d--) {\n let thenDate = new Date((new Date()).getTime() - d * 24 * 60 * 60 * 1000)\n arr.push(DateUtil.simpleDate(thenDate))\n }\n that.dateStrings = arr\n }\n\n //获取15日调用分时数据\n refreshDashboardPager() {\n let that = this;\n\n this.pager.setFilterValue(\"orderDt\", SortDirection.DESC)\n\n this.pager.httpList(function (response: any) {\n\n let list = that.pager.data\n\n if (list.length > 0) {\n that.dashboard.assign(list[0])\n }\n\n if (list.length > 1) {\n that.yesterdayDashboard.assign(list[1])\n }\n\n //数据转换成map,方便检索\n let map: { [key: string]: Dashboard } = {}\n for (let i = 0; i < list.length; i++) {\n map[list[i].dt] = list[i]\n }\n\n let invokeNumData = []\n let uvData = []\n let matterNumData = []\n let fileSizeData = []\n for (let i = 0; i < that.days; i++) {\n invokeNumData.push(0)\n uvData.push(0)\n matterNumData.push(0)\n fileSizeData.push(0)\n }\n\n //按照日期对应。\n for (let i = 0; i < that.dateStrings.length; i++) {\n let item = map[that.dateStrings[i]];\n if (item) {\n invokeNumData[i] = item.invokeNum\n uvData[i] = item.uv\n matterNumData[i] = item.matterNum\n fileSizeData[i] = item.fileSize\n\n }\n }\n\n //同环比\n that.standardWeekInvokeNum = 0\n that.compareWeekInvokeNum = 0\n //调用量日环比\n that.standardDayInvokeNum = 0\n that.compareDayInvokeNum = 0\n //UV周环比\n that.standardWeekUv = 0\n that.compareWeekUv = 0\n //UV日环比\n that.standardDayUv = 0\n that.compareDayUv = 0\n\n //文件总数周环比\n that.standardWeekMatterNum = 0\n that.compareWeekMatterNum = 0\n //文件总数日环比\n that.standardDayMatterNum = 0\n that.compareDayMatterNum = 0\n //文件大小周环比\n that.standardWeekSize = 0\n that.compareWeekSize = 0\n //文件大小日环比\n that.standardDaySize = 0\n that.compareDaySize = 0\n\n for (let i = 0; i < that.days; i++) {\n if (i >= 0 && i <= 6) {\n that.standardWeekInvokeNum += invokeNumData[i]\n that.standardWeekUv += uvData[i]\n that.standardWeekMatterNum += matterNumData[i]\n that.standardWeekSize += fileSizeData[i]\n\n } else if (i >= 7 && i <= 13) {\n that.compareWeekInvokeNum += invokeNumData[i]\n that.compareWeekUv += uvData[i]\n that.compareWeekMatterNum += matterNumData[i]\n that.compareWeekSize += fileSizeData[i]\n }\n if (i === 12) {\n that.standardDayInvokeNum = invokeNumData[i]\n that.standardDayUv = uvData[i]\n that.standardDayMatterNum = matterNumData[i]\n that.standardDaySize = fileSizeData[i]\n\n }\n if (i === 13) {\n that.compareDayInvokeNum = invokeNumData[i]\n that.compareDayUv = uvData[i]\n that.compareDayMatterNum = matterNumData[i]\n that.compareDaySize = fileSizeData[i]\n }\n }\n\n\n that.invokeListOption.xAxis.data = that.dateStrings.map((k) => k.substr(5))\n that.invokeListOption.series[0].data = invokeNumData\n that.invokeListOption.series[1].data = uvData\n\n that.updateUI()\n })\n\n }\n\n //获取下载前10的文件\n refreshMatterPager() {\n let that = this;\n that.matterPager.setFilterValue(\"orderTimes\", SortDirection.DESC)\n that.matterPager.httpList()\n }\n\n refreshActiveIpTop10() {\n let that = this\n that.dashboard.httpActiveIpTop10(function (data: any) {\n that.activeIpTop10 = data\n that.updateUI()\n })\n }\n\n reRun() {\n let that = this\n that.dashboard.httpEtl(function (data: any) {\n\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"))\n\n that.refresh()\n })\n }\n\n onChartReady() {\n\n }\n\n render() {\n\n let that = this\n\n let dashboard: Dashboard = this.dashboard\n let yesterdayDashboard: Dashboard = this.yesterdayDashboard\n\n return (\n
\n\n \n \n\n \n \n
\n
\n
{Lang.t(\"dashboard.totalInvokeNum\")}
\n
{dashboard.totalInvokeNum}
\n
\n \n \n
\n
\n
\n {Lang.t(\"dashboard.yesterdayInvoke\")}:{yesterdayDashboard.invokeNum}\n
\n
\n \n\n \n
\n
\n
{Lang.t(\"dashboard.totalUV\")}
\n
{dashboard.totalUv}
\n
\n \n \n
\n
\n
\n {Lang.t(\"dashboard.yesterdayUV\")}:{yesterdayDashboard.uv}\n
\n
\n \n\n\n \n
\n
\n
{Lang.t(\"dashboard.totalMatterNum\")}
\n
{dashboard.totalMatterNum}
\n
\n \n \n
\n
\n
\n {Lang.t(\"dashboard.yesterdayMatterNum\")}:{yesterdayDashboard.matterNum}\n
\n
\n \n\n \n
\n
\n
{Lang.t(\"dashboard.totalFileSize\")}
\n
{FileUtil.humanFileSize(dashboard.totalFileSize)}
\n
\n \n \n
\n
\n
\n {Lang.t(\"dashboard.yesterdayMatterSize\")}:{FileUtil.humanFileSize(yesterdayDashboard.fileSize)}\n
\n
\n \n
\n\n \n \n\n
\n
\n {Lang.t(\"dashboard.recentDayInvokeUV\", 15)}\n
\n
\n \n
\n
\n\n\n \n
\n\n \n \n\n
\n
\n {Lang.t(\"dashboard.downloadMatterTop10\")}\n
\n
\n
    \n {\n this.matterPager.data.map((matter: Matter, index: number) => {\n return (\n
  • \n {index + 1}\n {matter.name}\n {matter.times}\n
  • \n )\n })\n }\n
\n
\n
\n\n\n \n\n\n \n\n
\n
\n {Lang.t(\"dashboard.activeIpTop10\")}\n
\n
\n
    \n {\n this.activeIpTop10.map((item: IpStruct, index: number) => {\n return (\n
  • \n {index + 1}\n {item.ip}\n {item.times}\n
  • \n )\n })\n }\n
\n
\n
\n\n \n\n
\n\n
\n \n {Lang.t(\"dashboard.warnHint\")}\n {Lang.t(\"dashboard.reRun\")}\n }\n type=\"warning\"\n />\n
\n\n\n
\n );\n }\n}\n\n\n","import SafeUtil from '../../util/SafeUtil';\r\nimport BaseEntity from '../base/BaseEntity';\r\nimport User from \"../user/User\";\r\n\r\nexport default class Install extends BaseEntity {\r\n\r\n static URL_VERIFY = '/api/install/verify'\r\n static URL_TABLE_INFO_LIST = '/api/install/table/info/list'\r\n static URL_ADMIN_LIST = '/api/install/admin/list'\r\n static URL_CREATE_TABLE = '/api/install/create/table'\r\n static URL_CREATE_ADMIN = '/api/install/create/admin'\r\n static URL_VALIDATE_ADMIN = '/api/install/validate/admin'\r\n static URL_FINISH = '/api/install/finish'\r\n\r\n //数据库名\r\n mysqlPort: number = 3306\r\n mysqlHost: string = \"127.0.0.1\"\r\n mysqlSchema: string = \"tank\"\r\n mysqlUsername: string = \"tank\"\r\n mysqlPassword: string | null = null\r\n mysqlCharset: string = \"utf8\"\r\n\r\n //管理员用户名\r\n adminUsername: string | null = null\r\n adminPassword: string | null = null\r\n adminRepassword: string | null = null\r\n\r\n //表元信息\r\n tableInfoList: any[] = []\r\n\r\n //管理员列表\r\n adminList: User[] = []\r\n\r\n //数据库连接是否可用\r\n verified: boolean = false\r\n //管理员配置完毕\r\n adminConfigured: boolean = false\r\n\r\n\r\n constructor(reactComponent?: React.Component) {\r\n\r\n super(reactComponent);\r\n\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n\r\n }\r\n\r\n getMysqlForm() {\r\n return {\r\n mysqlHost: this.mysqlHost,\r\n mysqlPort: this.mysqlPort,\r\n mysqlSchema: this.mysqlSchema,\r\n mysqlUsername: this.mysqlUsername,\r\n mysqlPassword: this.mysqlPassword,\r\n mysqlCharset: this.mysqlCharset,\r\n }\r\n }\r\n\r\n getForm() {\r\n return {\r\n mysqlPort: this.mysqlPort,\r\n mysqlHost: this.mysqlHost,\r\n mysqlSchema: this.mysqlSchema,\r\n mysqlUsername: this.mysqlUsername,\r\n mysqlPassword: this.mysqlPassword,\r\n mysqlCharset: this.mysqlCharset,\r\n adminUsername: this.adminUsername,\r\n adminPassword: this.adminPassword,\r\n }\r\n }\r\n\r\n\r\n //表创建完毕\r\n tableCreated() {\r\n if (!this.tableInfoList || this.tableInfoList.length === 0) {\r\n return false\r\n }\r\n for (let i = 0; i < this.tableInfoList.length; i++) {\r\n let tableInfo = this.tableInfoList[i]\r\n if (!tableInfo.tableExist) {\r\n return false\r\n }\r\n\r\n if (tableInfo.tableExist && tableInfo.missingFields.length !== 0) {\r\n return false\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n httpVerify(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n this.httpPost(Install.URL_VERIFY, this.getMysqlForm(), function (response: any) {\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n\r\n }, errorCallback)\r\n }\r\n\r\n httpTableInfoList(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n if (!this.verified) {\r\n this.defaultErrorHandler(\"Please verify mysql first\", errorCallback)\r\n return\r\n }\r\n\r\n this.httpPost(Install.URL_TABLE_INFO_LIST, this.getForm(), function (response: any) {\r\n\r\n that.tableInfoList.splice(0, that.tableInfoList.length);\r\n that.tableInfoList.push(...response.data.data)\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n httpCreateTable(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n if (!this.verified) {\r\n this.defaultErrorHandler(\"Please verify mysql first\", errorCallback)\r\n return\r\n }\r\n\r\n this.httpPost(Install.URL_CREATE_TABLE, this.getForm(), function (response: any) {\r\n\r\n that.tableInfoList.splice(0, that.tableInfoList.length);\r\n that.tableInfoList.push(...response.data.data)\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n //获取管理员列表\r\n httpAdminList(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n if (!this.tableCreated()) {\r\n this.defaultErrorHandler(\"Please verify create table first\", errorCallback)\r\n return\r\n }\r\n\r\n\r\n let form = this.getForm()\r\n\r\n\r\n this.httpPost(Install.URL_ADMIN_LIST, form, function (response: any) {\r\n\r\n that.adminList = BaseEntity.renderList(response.data.data, User)\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n\r\n httpCreateAdmin(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n if (!this.tableCreated()) {\r\n this.defaultErrorHandler(\"Please verify create table first\", errorCallback)\r\n return\r\n }\r\n\r\n\r\n if (this.adminPassword !== this.adminRepassword) {\r\n this.defaultErrorHandler(\"password not same\", errorCallback)\r\n return\r\n }\r\n\r\n\r\n let form = this.getForm()\r\n\r\n this.httpPost(Install.URL_CREATE_ADMIN, form, function (response: any) {\r\n\r\n that.adminConfigured = true\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n\r\n //验证管理员账号\r\n httpValidateAdmin(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n if (!this.tableCreated()) {\r\n this.defaultErrorHandler(\"Please verify create table first\", errorCallback)\r\n return\r\n }\r\n\r\n if (!this.adminUsername || !this.adminPassword) {\r\n this.defaultErrorHandler(\"username and password required\", errorCallback)\r\n return\r\n }\r\n\r\n let form = this.getForm()\r\n\r\n this.httpPost(Install.URL_VALIDATE_ADMIN, form, function (response: any) {\r\n\r\n that.adminConfigured = true\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n\r\n //完成安装过程\r\n httpFinish(successCallback?: any, errorCallback?: any, finalCallback?: any) {\r\n let that = this\r\n\r\n\r\n let form = this.getForm()\r\n\r\n this.httpPost(Install.URL_FINISH, form, function (response: any) {\r\n\r\n\r\n SafeUtil.safeCallback(successCallback)(response);\r\n\r\n }, errorCallback, finalCallback)\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import React from 'react';\r\nimport './SetAdminPanel.less';\r\nimport Install from \"../../../common/model/install/Install\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport PhaseSelectingPanel from \"./inner/PhaseSelectingPanel\";\r\nimport PhaseVerifyPanel from \"./inner/PhaseVerifyPanel\";\r\nimport PhaseCreatePanel from \"./inner/PhaseCreatePanel\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\nenum Phase {\r\n //选择界面\r\n SELECTING = \"SELECTING\",\r\n //验证管理员\r\n VERIFY = \"VERIFY\",\r\n //创建管理员\r\n CREATE = \"CREATE\",\r\n}\r\n\r\ninterface IProps {\r\n\r\n install: Install\r\n\r\n onPreStep: () => void\r\n onNextStep: () => void\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class SetAdminPanel extends TankComponent {\r\n\r\n phase: Phase = Phase.SELECTING\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n }\r\n\r\n\r\n goToPrevious() {\r\n let that = this\r\n\r\n this.props.onPreStep()\r\n\r\n }\r\n\r\n goToNext() {\r\n let that = this\r\n let install: Install = this.props.install\r\n\r\n if (install.adminConfigured) {\r\n\r\n this.props.onNextStep()\r\n\r\n } else {\r\n MessageBoxUtil.error(Lang.t(\"install.configAdminFirst\"))\r\n }\r\n\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this;\r\n let install: Install = this.props.install\r\n let phase: Phase = this.phase\r\n\r\n return (\r\n
\r\n {phase === Phase.SELECTING && (\r\n\r\n {\r\n if (install.adminList.length) {\r\n that.phase = Phase.SELECTING\r\n } else {\r\n that.phase = Phase.CREATE\r\n }\r\n that.updateUI()\r\n }}\r\n onSelectVerify={() => {\r\n that.phase = Phase.VERIFY\r\n that.updateUI()\r\n }} onSelectCreate={() => {\r\n that.phase = Phase.CREATE\r\n that.updateUI()\r\n }} onPreStep={this.goToPrevious.bind(this)} onNextStep={this.goToNext.bind(this)}\r\n />\r\n )}\r\n\r\n\r\n {phase === Phase.VERIFY && (\r\n {\r\n\r\n that.props.onNextStep()\r\n\r\n }} onPreStep={() => {\r\n that.phase = Phase.SELECTING\r\n that.updateUI()\r\n\r\n }}/>\r\n )}\r\n\r\n {phase === Phase.CREATE && (\r\n {\r\n\r\n that.props.onNextStep()\r\n\r\n }} onPreStep={() => {\r\n that.phase = Phase.SELECTING\r\n that.updateUI()\r\n\r\n }}/>\r\n )}\r\n\r\n
\r\n )\r\n\r\n }\r\n}\r\n","import React from 'react';\nimport './MysqlPanel.less';\nimport {Alert, Button, Form, Input, Select} from 'antd';\nimport Install from \"../../../common/model/install/Install\";\nimport TankComponent from \"../../../common/component/TankComponent\";\nimport {FormInstance} from \"antd/lib/form\";\nimport {ArrowRightOutlined, DisconnectOutlined, LinkOutlined, SoundOutlined} from \"@ant-design/icons/lib\";\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\nimport Lang from \"../../../common/model/global/Lang\";\n\ninterface IProps {\n install: Install\n onNextStep: () => void\n}\n\ninterface IState {\n\n}\n\nexport default class MysqlPanel extends TankComponent {\n formRef = React.createRef();\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n let that = this;\n\n that.updateUI();\n }\n\n\n onFinish(values: any) {\n\n let that = this\n let install: Install = this.props.install\n\n install.mysqlHost = values[\"mysqlHost\"]\n install.mysqlPort = values[\"mysqlPort\"]\n install.mysqlSchema = values[\"mysqlSchema\"]\n install.mysqlUsername = values[\"mysqlUsername\"]\n install.mysqlPassword = values[\"mysqlPassword\"]\n install.mysqlCharset = values[\"mysqlCharset\"]\n\n install.httpVerify(function () {\n\n install.verified = true\n MessageBoxUtil.success(Lang.t(\"install.mysqlConnectionPass\"))\n that.updateUI()\n\n }, function (msg: any) {\n\n install.verified = false\n MessageBoxUtil.error(msg)\n that.updateUI()\n\n })\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n goToNext() {\n let that = this\n let install: Install = this.props.install\n\n if (install.verified) {\n\n this.props.onNextStep()\n\n } else {\n MessageBoxUtil.error(Lang.t(\"install.validateMysqlFirst\"))\n\n }\n\n }\n\n\n render() {\n\n let that = this;\n\n let install: Install = this.props.install\n\n const layout = {\n labelCol: {span: 6},\n wrapperCol: {span: 18},\n };\n\n return (\n
\n\n {\n that.updateUI()\n }}\n >\n \n \n \n\n \n \n \n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n\n \n \n \n\n
\n \n
{Lang.t(\"install.notice\")}
\n
\n
    \n
  1. {Lang.t(\"install.mysqlNotice1\")}
  2. \n
  3. {Lang.t(\"install.mysqlNotice2\")}
  4. \n
\n
\n
}\n type=\"info\"\n />\n
\n\n
\n \n \n
\n\n \n\n \n );\n }\n}\n\n\n","import React from 'react';\r\nimport './CreateTablePanel.less';\r\nimport {Alert, Button, Spin, Tag} from 'antd';\r\nimport Install from \"../../../common/model/install/Install\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport Color from \"../../../common/model/base/option/Color\";\r\nimport {\r\n ArrowLeftOutlined,\r\n ArrowRightOutlined,\r\n CheckOutlined,\r\n FormatPainterOutlined,\r\n SoundOutlined,\r\n SyncOutlined\r\n} from \"@ant-design/icons/lib\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n\r\n install: Install\r\n onPreStep: () => void\r\n onNextStep: () => void\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class CreateTablePanel extends TankComponent {\r\n\r\n loading: boolean = true\r\n\r\n createTableLoading: boolean = false\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n this.fetchTableInfoList()\r\n\r\n }\r\n\r\n fetchTableInfoList() {\r\n\r\n let that = this\r\n let install: Install = this.props.install\r\n\r\n this.loading = true\r\n this.updateUI()\r\n\r\n install.httpTableInfoList(null, null, function () {\r\n that.loading = false\r\n that.updateUI()\r\n })\r\n }\r\n\r\n createTable() {\r\n //开始建表\r\n let that = this;\r\n let install: Install = this.props.install\r\n\r\n that.createTableLoading = true\r\n that.updateUI()\r\n\r\n install.httpCreateTable(function () {\r\n MessageBoxUtil.success(Lang.t(\"install.createTableSuccess\"))\r\n }, null, function () {\r\n\r\n that.createTableLoading = false\r\n that.updateUI()\r\n })\r\n }\r\n\r\n goToPrevious() {\r\n let that = this\r\n\r\n this.props.onPreStep()\r\n\r\n }\r\n\r\n goToNext() {\r\n let that = this\r\n let install: Install = this.props.install\r\n\r\n if (install.tableCreated()) {\r\n\r\n this.props.onNextStep()\r\n\r\n } else {\r\n MessageBoxUtil.error(Lang.t(\"install.crateTableFirst\"))\r\n }\r\n\r\n }\r\n\r\n render() {\r\n\r\n let that = this;\r\n\r\n let install: Install = this.props.install\r\n\r\n let tableCreated: boolean = install.tableCreated()\r\n\r\n return (\r\n
\r\n\r\n \r\n {\r\n install.tableInfoList.map(function (tableInfo: any, index: number) {\r\n\r\n return (\r\n
\r\n
\r\n {tableInfo.name}\r\n\r\n {\r\n (tableInfo.tableExist && tableInfo.missingFields.length === 0) && (\r\n {Lang.t(\"install.installed\")}\r\n )\r\n }\r\n\r\n {\r\n (tableInfo.tableExist && tableInfo.missingFields.length > 0) && (\r\n {Lang.t(\"install.installedButMissing\")}\r\n )\r\n }\r\n\r\n {\r\n !tableInfo.tableExist && (\r\n {Lang.t(\"install.toBeInstalled\")}\r\n )\r\n }\r\n
\r\n\r\n
\r\n {Lang.t(\"install.allFields\")}:\r\n {\r\n tableInfo.allFields.map(function (field: any, j: number) {\r\n\r\n return (\r\n \r\n {field.DBName}\r\n \r\n )\r\n })\r\n }\r\n
\r\n\r\n\r\n {\r\n (tableInfo.tableExist && tableInfo.missingFields.length > 0) && (\r\n
\r\n {Lang.t(\"install.missingFields\")}:\r\n {\r\n tableInfo.missingFields.map(function (field: any, j: number) {\r\n\r\n return (\r\n \r\n {field.DBName}\r\n \r\n )\r\n })\r\n }\r\n
\r\n )\r\n }\r\n\r\n
\r\n )\r\n\r\n })\r\n }\r\n\r\n\r\n
\r\n \r\n
{Lang.t(\"install.tableNotice\")}
\r\n
\r\n
    \r\n
  1. {Lang.t(\"install.tableNotice1\")}
  2. \r\n
  3. {Lang.t(\"install.tableNotice2\")}
  4. \r\n
  5. {Lang.t(\"install.tableNotice3\")}
  6. \r\n
  7. {Lang.t(\"install.tableNotice4\")}
  8. \r\n
\r\n
\r\n
}\r\n type=\"info\"\r\n />\r\n
\r\n\r\n\r\n
\r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n\r\n \r\n\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\nimport './PhaseSelectingPanel.less';\r\nimport TankComponent from \"../../../../common/component/TankComponent\";\r\nimport Install from \"../../../../common/model/install/Install\";\r\nimport User from \"../../../../common/model/user/User\";\r\nimport {Button} from \"antd\";\r\nimport {\r\n ArrowLeftOutlined,\r\n ArrowRightOutlined,\r\n SecurityScanOutlined,\r\n SyncOutlined,\r\n UserAddOutlined\r\n} from \"@ant-design/icons/lib\";\r\nimport Lang from \"../../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n install: Install\r\n\r\n onRefresh: () => void\r\n onSelectVerify: () => void\r\n onSelectCreate: () => void\r\n onPreStep: () => void\r\n onNextStep: () => void\r\n\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class PhaseSelectingPanel extends TankComponent {\r\n\r\n loadingAdminList: boolean = false\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n this.refreshAdminList()\r\n }\r\n\r\n\r\n refreshAdminList() {\r\n //开始创建管理员\r\n let that = this;\r\n let install: Install = this.props.install\r\n\r\n that.loadingAdminList = true\r\n that.updateUI()\r\n\r\n install.httpAdminList(null, null, function () {\r\n that.loadingAdminList = false\r\n that.updateUI()\r\n that.props.onRefresh()\r\n })\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this;\r\n let install: Install = this.props.install\r\n\r\n return (\r\n
\r\n\r\n
\r\n {Lang.t(\"install.detectAdministrator\")}:\r\n
\r\n {\r\n install.adminList.map(function (admin: User, index: number) {\r\n return (\r\n
\r\n {admin.username}\r\n
\r\n )\r\n })\r\n }\r\n\r\n
\r\n {Lang.t(\"install.useOrCreateAdministrator\")}\r\n
\r\n\r\n
\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n
\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\nimport './PhaseVerifyPanel.less';\nimport TankComponent from \"../../../../common/component/TankComponent\";\nimport Install from \"../../../../common/model/install/Install\";\nimport {Button, Form, Input} from \"antd\";\nimport {ArrowLeftOutlined, SendOutlined} from \"@ant-design/icons/lib\";\nimport MessageBoxUtil from \"../../../../common/util/MessageBoxUtil\";\nimport Lang from \"../../../../common/model/global/Lang\";\n\ninterface IProps {\n\n install: Install\n\n\n onSuccess: () => void\n onPreStep: () => void\n\n}\n\ninterface IState {\n\n}\n\nexport default class PhaseVerifyPanel extends TankComponent {\n\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n\n componentDidMount() {\n let that = this;\n\n }\n\n\n onFinish(values: any) {\n\n\n let that = this;\n let install: Install = this.props.install\n\n install.adminUsername = values[\"adminUsername\"]\n install.adminPassword = values[\"adminPassword\"]\n\n install.httpValidateAdmin(function () {\n MessageBoxUtil.success(Lang.t(\"install.validateAdminSuccess\"))\n\n that.props.onSuccess()\n })\n\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n render() {\n\n let that = this;\n let install: Install = this.props.install\n\n const layout = {\n labelCol: {span: 6},\n wrapperCol: {span: 18},\n };\n\n\n return (\n
\n\n
\n

{Lang.t(\"install.validateAdministrator\")}

\n
\n\n {\n that.updateUI()\n }}\n >\n \n \n \n\n \n \n \n\n
\n\n \n\n \n\n
\n \n\n
\n );\n }\n}\n\n\n","import React from 'react';\nimport './PhaseCreatePanel.less';\nimport TankComponent from \"../../../../common/component/TankComponent\";\nimport Install from \"../../../../common/model/install/Install\";\nimport MessageBoxUtil from \"../../../../common/util/MessageBoxUtil\";\nimport {Button, Form, Input} from \"antd\";\nimport {ArrowLeftOutlined, SendOutlined} from \"@ant-design/icons/lib\";\nimport Lang from \"../../../../common/model/global/Lang\";\n\ninterface IProps {\n\n install: Install\n\n onSuccess: () => void\n onPreStep: () => void\n\n}\n\ninterface IState {\n\n}\n\nexport default class PhaseCreatePanel extends TankComponent {\n\n\n constructor(props: IProps) {\n super(props);\n\n this.state = {};\n }\n\n\n componentDidMount() {\n let that = this;\n\n }\n\n onFinish(values: any) {\n\n\n let that = this;\n let install: Install = this.props.install\n\n install.adminUsername = values[\"adminUsername\"]\n install.adminPassword = values[\"adminPassword\"]\n install.adminRepassword = values[\"adminRepassword\"]\n\n install.httpCreateAdmin(function () {\n MessageBoxUtil.success(Lang.t(\"install.createAdminSuccess\"))\n that.props.onSuccess()\n })\n };\n\n onFinishFailed(errorInfo: any) {\n\n };\n\n render() {\n\n let that = this;\n let install: Install = this.props.install\n\n const layout = {\n labelCol: {span: 6},\n wrapperCol: {span: 18},\n };\n\n\n return (\n
\n\n
\n

{Lang.t(\"install.createAdministrator\")}

\n
\n\n {\n that.updateUI()\n }}\n >\n \n \n \n\n \n \n \n\n\n ({\n validator(rule, value) {\n if (!value || getFieldValue('adminPassword') === value) {\n return Promise.resolve();\n }\n return Promise.reject(Lang.t(\"user.passwordNotSame\"));\n },\n }),\n ]}\n >\n \n \n\n
\n\n \n\n \n\n
\n \n\n
\n );\n }\n}\n\n\n","import React from 'react';\r\nimport './FinishPanel.less';\r\nimport Install from \"../../../common/model/install/Install\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport {Button, Result} from \"antd\";\r\nimport {HomeOutlined} from \"@ant-design/icons/lib\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n\r\n install: Install\r\n}\r\n\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class FinishPanel extends TankComponent {\r\n\r\n\r\n loading: boolean = false\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n that.updateUI();\r\n }\r\n\r\n finish() {\r\n\r\n let that = this\r\n let install: Install = this.props.install\r\n\r\n that.loading = true\r\n that.updateUI()\r\n\r\n install.httpFinish(function () {\r\n\r\n\r\n window.location.href = \"/\"\r\n\r\n }, null, function () {\r\n\r\n that.loading = false\r\n that.updateUI()\r\n\r\n })\r\n\r\n }\r\n\r\n render() {\r\n\r\n let that = this;\r\n\r\n return (\r\n
\r\n } type=\"primary\" key=\"home\" loading={that.loading}\r\n onClick={this.finish.bind(this)}>\r\n {Lang.t(\"install.enterHome\")}\r\n \r\n ]}\r\n />\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\nimport {RouteComponentProps} from 'react-router-dom';\r\nimport './Index.less';\r\nimport TankComponent from '../../common/component/TankComponent';\r\nimport Moon from '../../common/model/global/Moon';\r\nimport User from '../../common/model/user/User';\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport {Tabs} from 'antd';\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport Install from \"../../common/model/install/Install\";\r\nimport MysqlPanel from \"./widget/MysqlPanel\";\r\nimport CreateTablePanel from \"./widget/CreateTablePanel\";\r\nimport SetAdminPanel from \"./widget/SetAdminPanel\";\r\nimport FinishPanel from \"./widget/FinishPanel\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\n\r\nconst {TabPane} = Tabs;\r\n\r\ninterface IProps extends RouteComponentProps {\r\n\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\n\r\nexport default class Index extends TankComponent {\r\n\r\n user: User = Moon.getSingleton().user;\r\n\r\n install: Install = new Install()\r\n\r\n //当前高亮的tab\r\n activeName: string = \"first\"\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n\r\n componentDidMount() {\r\n let that = this;\r\n\r\n that.updateUI();\r\n }\r\n\r\n\r\n render() {\r\n\r\n let that = this;\r\n\r\n let install: Install = this.install\r\n\r\n return (\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n {\r\n\r\n this.activeName = activeKey\r\n this.updateUI()\r\n }}>\r\n \r\n {\r\n this.activeName = \"second\"\r\n this.updateUI()\r\n }}/>\r\n \r\n \r\n {\r\n this.activeName = \"first\"\r\n this.updateUI()\r\n }} onNextStep={() => {\r\n this.activeName = \"third\"\r\n this.updateUI()\r\n }}/>\r\n \r\n \r\n {\r\n this.activeName = \"second\"\r\n this.updateUI()\r\n }} onNextStep={() => {\r\n this.activeName = \"forth\"\r\n this.updateUI()\r\n }}/>\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","//导演类,用户来让整个工作有序进行\r\nexport default class Director {\r\n //正在重命名\r\n renameMode:boolean = false\r\n //正在创建新文件夹\r\n createMode:boolean = false\r\n //正在移动文件\r\n moveMode:boolean = false\r\n\r\n isEditing() {\r\n return this.renameMode || this.createMode || this.moveMode\r\n }\r\n\r\n}\r\n","import SafeUtil from \"./SafeUtil\";\r\n\r\nexport default class AnimateUtil {\r\n\r\n /**\r\n * 动画函数\r\n * @param startValue 开始的值\r\n * @param endValue 结束的值\r\n * @param duration 动画持续时间,单位ms 如果开始值和结束值一样,那么会提前结束。\r\n * @param processHandler 过程中处理的回调函数. 该函数能保证第一个值是startValue,结束的值是endValue\r\n * @param startHandler 开始的回调函数\r\n * @param endHandler 结束的回调函数\r\n * @param standard 每隔多少毫秒进行一次处理。\r\n *\r\n */\r\n static animate(\r\n startValue: number,\r\n endValue: number,\r\n duration: number,\r\n processHandler: (value: number) => void,\r\n startHandler?: (value: number) => void,\r\n endHandler?: (value: number) => void,\r\n standard?: number\r\n ): void {\r\n\r\n\r\n //规则校验。\r\n if (duration <= 0) {\r\n console.error(\"duration值只能是正整数\")\r\n return\r\n }\r\n\r\n if (standard == undefined) {\r\n standard = 20\r\n } else if (standard <= 0) {\r\n console.error(\"standard值只能是正整数\")\r\n return\r\n }\r\n\r\n let totalStep: number = endValue - startValue\r\n\r\n //从startValue到endValue需要触发几次。\r\n let num = Math.ceil(duration / standard)\r\n\r\n //每一步的长度\r\n let delta: number = totalStep\r\n if (num != 0) {\r\n delta = Math.ceil(totalStep / num)\r\n }\r\n\r\n //定时执行\r\n let sum = 0;\r\n SafeUtil.safeCallback(startHandler)(startValue)\r\n processHandler(startValue)\r\n let intervalHandler = setInterval(() => {\r\n\r\n sum = sum + delta\r\n if (Math.abs(sum) >= Math.abs(totalStep)) {\r\n //该停止了\r\n processHandler(endValue)\r\n SafeUtil.safeCallback(endHandler)(endValue)\r\n\r\n //关闭定时器。\r\n clearInterval(intervalHandler)\r\n\r\n } else {\r\n //更新当前进度\r\n processHandler(startValue + sum)\r\n }\r\n\r\n }, standard)\r\n\r\n }\r\n\r\n static setInputSelection(input: HTMLInputElement, startPos: number, endPos: number) {\r\n input.focus();\r\n if (typeof input.selectionStart !== \"undefined\") {\r\n input.selectionStart = startPos;\r\n input.selectionEnd = endPos;\r\n } else if ((document as any).selection && (document as any).selection.createRange) {\r\n // IE branch\r\n input.select();\r\n let range = (document as any).selection.createRange();\r\n range.collapse(true);\r\n range.moveEnd(\"character\", endPos);\r\n range.moveStart(\"character\", startPos);\r\n range.select();\r\n }\r\n }\r\n\r\n\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport { Modal, Button } from \"antd\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport Moon from \"../../../common/model/global/Moon\";\r\nimport { ExclamationCircleFilled } from \"@ant-design/icons\";\r\nimport \"./MatterDeleteModal.less\";\r\nimport Preference from \"../../../common/model/preference/Preference\";\r\n\r\ninterface IProps {\r\n onSoftDel: () => void;\r\n onHardDel: () => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class MatterDeleteModal extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n static preference: Preference = Moon.getSingleton().preference;\r\n\r\n static open(onSoftDel: () => void, onHardDel: () => void) {\r\n let modal = Modal.warning({\r\n className: \"delete-modal\",\r\n title: Lang.t(\"delete\"),\r\n icon: ,\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\",\r\n },\r\n content: (\r\n {\r\n onSoftDel();\r\n modal.destroy();\r\n }}\r\n onHardDel={() => {\r\n onHardDel();\r\n modal.destroy();\r\n }}\r\n onClose={() => {\r\n modal.destroy();\r\n }}\r\n />\r\n ),\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n

{Lang.t(\"actionDeleteConfirm\")}

\r\n
\r\n \r\n \r\n {Lang.t(\"deleteDirectly\")}\r\n \r\n {MatterDeleteModal.preference.getRecycleBinStatus() && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import SelectionOption from \"../base/option/SelectionOption\";\r\n\r\nenum ShareType {\r\n FILE = \"FILE\",\r\n DIRECTORY = \"DIRECTORY\",\r\n MIX = \"MIX\",\r\n}\r\n\r\nconst ShareTypes: ShareType[] = Object.keys(ShareType).map(\r\n (k) => k as ShareType\r\n);\r\n\r\nconst ShareTypeMap: { [key in keyof typeof ShareType]: SelectionOption } = {\r\n FILE: {\r\n name: \"文件\",\r\n value: \"FILE\",\r\n },\r\n DIRECTORY: {\r\n name: \"文件夹\",\r\n value: \"DIRECTORY\",\r\n },\r\n MIX: {\r\n name: \"混合\",\r\n value: \"MIX\",\r\n },\r\n};\r\n\r\nlet ShareTypeList: SelectionOption[] = [];\r\nShareTypes.forEach((type: ShareType) => {\r\n ShareTypeList.push(ShareTypeMap[type]);\r\n});\r\n\r\nexport { ShareType, ShareTypeMap, ShareTypeList };\r\n","import React from \"react\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport Director from \"./Director\";\r\nimport \"./MatterPanel.less\";\r\nimport Sun from \"../../../common/model/global/Sun\";\r\nimport StringUtil from \"../../../common/util/StringUtil\";\r\nimport DateUtil from \"../../../common/util/DateUtil\";\r\nimport AnimateUtil from \"../../../common/util/AnimateUtil\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport Expanding from \"../../widget/Expanding\";\r\nimport {\r\n LockOutlined,\r\n UnlockOutlined,\r\n DownloadOutlined,\r\n ExclamationCircleFilled,\r\n LinkOutlined,\r\n DeleteOutlined,\r\n EditOutlined,\r\n InfoCircleOutlined,\r\n EllipsisOutlined,\r\n RedoOutlined,\r\n CloseCircleOutlined,\r\n} from \"@ant-design/icons\";\r\nimport { Modal, Checkbox, Tooltip } from \"antd\";\r\nimport { CheckboxChangeEvent } from \"antd/es/checkbox\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport ClipboardUtil from \"../../../common/util/ClipboardUtil\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport MatterDeleteModal from \"./MatterDeleteModal\";\r\n\r\ninterface IProps {\r\n matter: Matter;\r\n recycleMode?: boolean; // 回收站模式,默认false,简化相关操作,不可进入文件夹里\r\n director?: Director;\r\n onCreateDirectoryCallback?: () => any;\r\n onDeleteSuccess?: () => any;\r\n onRecoverySuccess?: () => any;\r\n onCheckMatter?: (matter?: Matter) => any;\r\n onPreviewImage?: (matter: Matter) => any;\r\n onGoToDirectory?: (id: string) => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class MatterPanel extends TankComponent {\r\n // 正在重命名的临时字段\r\n renameMatterName: string = \"\";\r\n // 正在向服务器提交rename的请求\r\n renamingLoading: boolean = false;\r\n // 小屏幕下操作栏\r\n showMore: boolean = false;\r\n\r\n inputRef = React.createRef();\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n prepareRename = () => {\r\n const { matter, director } = this.props;\r\n if (director!.isEditing()) {\r\n console.error(\"导演正忙着,不予执行\");\r\n return;\r\n }\r\n\r\n //告诉导演,自己正在编辑\r\n director!.renameMode = true;\r\n matter.editMode = true;\r\n this.renameMatterName = matter.name!;\r\n this.updateUI();\r\n setTimeout(() => {\r\n if (!this.inputRef.current) return;\r\n //如果是文件夹,全选中\r\n let dotIndex = matter.name!.lastIndexOf(\".\");\r\n if (dotIndex === -1) {\r\n AnimateUtil.setInputSelection(\r\n this.inputRef.current,\r\n 0,\r\n this.renameMatterName.length\r\n );\r\n } else {\r\n AnimateUtil.setInputSelection(this.inputRef.current, 0, dotIndex);\r\n }\r\n });\r\n };\r\n\r\n clipboard = () => {\r\n let textToCopy = this.props.matter.getDownloadUrl();\r\n ClipboardUtil.copy(textToCopy, () => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n });\r\n };\r\n\r\n deleteMatter = () => {\r\n MatterDeleteModal.open(\r\n () => {\r\n this.props.matter.httpSoftDelete(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onDeleteSuccess!();\r\n });\r\n },\r\n () => {\r\n this.props.matter.httpDelete(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onDeleteSuccess!();\r\n });\r\n }\r\n );\r\n };\r\n\r\n hardDeleteMatter = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionCanNotRevertConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n this.props.matter.httpDelete(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onDeleteSuccess!();\r\n });\r\n },\r\n });\r\n };\r\n\r\n recoveryMatter = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionRecoveryConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n this.props.matter.httpRecovery(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onRecoverySuccess!();\r\n });\r\n },\r\n });\r\n };\r\n\r\n changeMatterName = (e: any) => {\r\n this.renameMatterName = e.currentTarget.value;\r\n this.updateUI();\r\n };\r\n\r\n finishRename = () => {\r\n //有可能按enter的时候和blur同时了。\r\n if (this.renamingLoading) {\r\n return;\r\n }\r\n const { matter, director } = this.props;\r\n this.renamingLoading = true;\r\n\r\n matter.httpRename(\r\n this.renameMatterName,\r\n () => {\r\n this.renamingLoading = false;\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n //告诉导演,自己编辑完毕\r\n director!.renameMode = false;\r\n matter.editMode = false;\r\n },\r\n (msg: string) => {\r\n this.renamingLoading = false;\r\n MessageBoxUtil.error(msg);\r\n //告诉导演,自己编辑完毕\r\n director!.renameMode = false;\r\n matter.editMode = false;\r\n },\r\n () => this.updateUI()\r\n );\r\n };\r\n\r\n finishCreateDirectory = () => {\r\n const { matter, director, onCreateDirectoryCallback } = this.props;\r\n matter.name = this.renameMatterName;\r\n matter.httpCreateDirectory(\r\n () => {\r\n director!.createMode = false;\r\n matter.editMode = false;\r\n matter.assign(new Matter());\r\n },\r\n (msg: string) => {\r\n director!.createMode = false;\r\n matter.editMode = false;\r\n MessageBoxUtil.error(msg);\r\n },\r\n () => onCreateDirectoryCallback!()\r\n );\r\n };\r\n\r\n blurTrigger = () => {\r\n const { matter, director } = this.props;\r\n if (matter.editMode) {\r\n if (director!.createMode) {\r\n this.finishCreateDirectory();\r\n } else if (director!.renameMode) {\r\n this.finishRename();\r\n }\r\n }\r\n };\r\n\r\n enterTrigger = (e: any) => {\r\n if (e.key.toLowerCase() === \"enter\") {\r\n this.inputRef.current!.blur();\r\n }\r\n };\r\n\r\n changePrivacy = (privacy: boolean) => {\r\n this.props.matter.httpChangePrivacy(privacy, () => {\r\n this.updateUI();\r\n });\r\n };\r\n\r\n checkToggle = (e: CheckboxChangeEvent) => {\r\n this.props.matter.check = e.target.checked;\r\n this.props.onCheckMatter!(this.props.matter);\r\n };\r\n\r\n highLight = () => {\r\n this.inputRef.current!.select();\r\n };\r\n\r\n clickRow = () => {\r\n const {\r\n matter,\r\n recycleMode = false,\r\n director,\r\n onGoToDirectory,\r\n onPreviewImage,\r\n } = this.props;\r\n if (director && director.isEditing()) {\r\n console.error(\"导演正忙着,不予执行\");\r\n return;\r\n }\r\n\r\n if (matter.dir) {\r\n if (recycleMode) return;\r\n onGoToDirectory!(matter.uuid!);\r\n } else {\r\n //图片进行预览操作\r\n if (matter.isImage()) {\r\n onPreviewImage!(matter);\r\n } else {\r\n matter.preview();\r\n }\r\n }\r\n };\r\n\r\n toggleHandles = () => {\r\n this.showMore = !this.showMore;\r\n this.updateUI();\r\n };\r\n\r\n renderPcOperation = () => {\r\n const { matter, recycleMode = false } = this.props;\r\n\r\n // 文件操作在正常模式 or 回收站模式下不同,其中回收站模式只保留查看信息与彻底删除操作\r\n const handles = recycleMode ? (\r\n <>\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.recoveryMatter())\r\n }\r\n />\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n Sun.navigateTo(\"/matter/detail/\" + matter.uuid)\r\n )\r\n }\r\n />\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.hardDeleteMatter())\r\n }\r\n />\r\n \r\n \r\n ) : (\r\n <>\r\n {!matter.dir && matter.privacy && (\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.changePrivacy(false))\r\n }\r\n />\r\n \r\n )}\r\n {!matter.dir && !matter.privacy && (\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.changePrivacy(true))\r\n }\r\n />\r\n \r\n )}\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n Sun.navigateTo(\"/matter/detail/\" + matter.uuid)\r\n )\r\n }\r\n />\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.prepareRename())\r\n }\r\n />\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.clipboard())}\r\n />\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(matter.download())}\r\n />\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.deleteMatter())\r\n }\r\n />\r\n \r\n \r\n );\r\n\r\n return (\r\n
\r\n {handles}\r\n \r\n \r\n {StringUtil.humanFileSize(matter.size)}\r\n \r\n \r\n {recycleMode ? (\r\n \r\n \r\n {DateUtil.simpleDateHourMinute(matter.deleteTime)}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {DateUtil.simpleDateHourMinute(matter.updateTime)}\r\n \r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n renderMobileOperation = () => {\r\n const { matter, recycleMode = false } = this.props;\r\n\r\n // 文件操作在正常模式 or 回收站模式下不同,其中回收站模式只保留查看信息与彻底删除操作\r\n const handles = recycleMode ? (\r\n <>\r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n Sun.navigateTo(\"/matter/detail/\" + matter.uuid)\r\n )\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.fileDetail\")}\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.recoveryMatter())\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.recovery\")}\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.hardDeleteMatter())\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.hardDelete\")}\r\n \r\n \r\n ) : (\r\n <>\r\n {!matter.dir && matter.privacy && (\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.changePrivacy(false))\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.setPublic\")}\r\n \r\n )}\r\n\r\n {!matter.dir && !matter.privacy && (\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.changePrivacy(true))\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.setPrivate\")}\r\n \r\n )}\r\n\r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n Sun.navigateTo(\"/matter/detail/\" + matter.uuid)\r\n )\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.fileDetail\")}\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.prepareRename())}\r\n >\r\n \r\n {Lang.t(\"matter.rename\")}\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.clipboard())}\r\n >\r\n \r\n {Lang.t(\"matter.copyLink\")}\r\n \r\n SafeUtil.stopPropagationWrap(e)(matter.download())}\r\n >\r\n \r\n {Lang.t(\"matter.download\")}\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.deleteMatter())}\r\n >\r\n \r\n {Lang.t(\"matter.delete\")}\r\n \r\n \r\n );\r\n\r\n return (\r\n
\r\n
\r\n \r\n {DateUtil.simpleDateHourMinute(\r\n recycleMode ? matter.deleteTime : matter.updateTime\r\n )}\r\n \r\n \r\n {StringUtil.humanFileSize(matter.size)}\r\n \r\n
\r\n {handles}\r\n
\r\n );\r\n };\r\n\r\n render() {\r\n const { matter } = this.props;\r\n\r\n return (\r\n
\r\n
SafeUtil.stopPropagationWrap(e)(this.clickRow())}>\r\n
\r\n
\r\n
\r\n SafeUtil.stopPropagationWrap(e)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n {/*在大屏幕下的操作栏*/}\r\n
\r\n {matter.uuid && this.renderPcOperation()}\r\n
\r\n\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.toggleHandles())\r\n }\r\n >\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n {matter.editMode ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n {matter.name}\r\n {!matter.dir && !matter.privacy && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n {this.showMore ? this.renderMobileOperation() : null}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport { Modal, Tree, Button } from \"antd\";\r\nimport Pager from \"../../../common/model/base/Pager\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport \"./MoveBatchModal.less\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport { FolderFilled, FolderOpenFilled, ExclamationCircleFilled } from \"@ant-design/icons\";\r\n\r\ninterface IProps {\r\n onSuccess: (uuid: string) => any;\r\n onClose: () => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class MoveBatchModal extends TankComponent {\r\n pager = new Pager(this, Matter, 10);\r\n targetUuid = \"root\";\r\n treeData = [\r\n {\r\n title: Lang.t(\"matter.root\"),\r\n key: \"root\",\r\n },\r\n ];\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n this.pager.setFilterValue(\"orderCreateTime\", \"DESC\");\r\n this.pager.setFilterValue(\"dir\", true);\r\n }\r\n\r\n static open(onSuccess: (uuid: string) => void) {\r\n let modal = Modal.confirm({\r\n className: \"move-modal\",\r\n title: Lang.t(\"matter.moveTo\"),\r\n icon: ,\r\n width: \"90vw\",\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\",\r\n },\r\n content: (\r\n {\r\n modal.destroy();\r\n onSuccess(uuid);\r\n }}\r\n onClose={() => {\r\n modal.destroy();\r\n }}\r\n />\r\n ),\r\n });\r\n }\r\n\r\n fetchData = (treeNode: any, success: () => any) => {\r\n const { data: origin } = treeNode.props;\r\n this.pager.setFilterValue(\"puuid\", treeNode.key);\r\n this.pager.httpList((response: any) => {\r\n const { data, page, totalPages } = response.data.data;\r\n origin.children = (origin.children || []).concat(\r\n data.map((matter: Matter) => ({\r\n title: matter.name,\r\n key: matter.uuid,\r\n }))\r\n );\r\n if (page + 1 < totalPages) {\r\n this.pager.page++;\r\n this.fetchData(treeNode, success);\r\n } else {\r\n this.pager.page = 0;\r\n success();\r\n }\r\n });\r\n };\r\n\r\n onLoadData = (treeNode: any) => {\r\n return new Promise((resolve) => {\r\n if (treeNode.props.children) {\r\n resolve();\r\n return;\r\n }\r\n this.fetchData(treeNode, () => resolve());\r\n }).then(() => {\r\n this.treeData = JSON.parse(JSON.stringify(this.treeData));\r\n this.updateUI();\r\n });\r\n };\r\n\r\n onSelect = (selectedKeys: any) => {\r\n if (selectedKeys.length) {\r\n this.targetUuid = selectedKeys[0];\r\n this.updateUI();\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n
\r\n e.expanded ? : }\r\n />\r\n
\r\n \r\n this.props.onSuccess(this.targetUuid)}\r\n >\r\n {Lang.t(\"confirm\")}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import SelectionOption from \"../base/option/SelectionOption\";\r\n\r\nenum ShareExpireOption {\r\n HOUR = \"HOUR\",\r\n DAY = \"DAY\",\r\n WEEK = \"WEEK\",\r\n MONTH = \"MONTH\",\r\n YEAR = \"YEAR\",\r\n INFINITY = \"INFINITY\",\r\n}\r\n\r\ninterface ShareExpireSelection extends SelectionOption {\r\n deltaMillisecond: number;\r\n}\r\n\r\nconst ShareExpireOptions: ShareExpireOption[] = Object.keys(\r\n ShareExpireOption\r\n).map((k) => k as ShareExpireOption);\r\n\r\nconst ShareExpireOptionMap: {\r\n [key in keyof typeof ShareExpireOption]: ShareExpireSelection;\r\n} = {\r\n HOUR: {\r\n name: \"share.hour\",\r\n value: \"HOUR\",\r\n deltaMillisecond: 60 * 60 * 1000,\r\n },\r\n DAY: {\r\n name: \"share.day\",\r\n value: \"DAY\",\r\n deltaMillisecond: 24 * 60 * 60 * 1000,\r\n },\r\n WEEK: {\r\n name: \"share.week\",\r\n value: \"WEEK\",\r\n deltaMillisecond: 7 * 24 * 60 * 60 * 1000,\r\n },\r\n MONTH: {\r\n name: \"share.month\",\r\n value: \"MONTH\",\r\n deltaMillisecond: 30 * 24 * 60 * 60 * 1000,\r\n },\r\n YEAR: {\r\n name: \"share.year\",\r\n value: \"YEAR\",\r\n deltaMillisecond: 365 * 24 * 60 * 60 * 1000,\r\n },\r\n INFINITY: {\r\n name: \"share.infinity\",\r\n value: \"INFINITY\",\r\n deltaMillisecond: 0,\r\n },\r\n};\r\n\r\nlet ShareExpireOptionList: ShareExpireSelection[] = [];\r\nShareExpireOptions.forEach((type: ShareExpireOption) => {\r\n ShareExpireOptionList.push(ShareExpireOptionMap[type]);\r\n});\r\n\r\nexport { ShareExpireOption, ShareExpireOptionMap, ShareExpireOptionList };\r\n","import BaseEntity from \"../base/BaseEntity\";\r\nimport Matter from \"../matter/Matter\";\r\nimport FileUtil from \"../../util/FileUtil\";\r\nimport EnvUtil from \"../../util/EnvUtil\";\r\nimport { ShareType } from \"./ShareType\";\r\nimport { ShareExpireOption, ShareExpireOptionMap } from \"./ShareExpireOption\";\r\nimport DateUtil from \"../../util/DateUtil\";\r\nimport SafeUtil from \"../../util/SafeUtil\";\r\nimport MessageBoxUtil from \"../../util/MessageBoxUtil\";\r\n\r\nexport default class Share extends BaseEntity {\r\n name: string | null = null;\r\n shareType: ShareType = ShareType.MIX;\r\n userUuid: string | null = null;\r\n username: string | null = null;\r\n downloadTimes: number = 0;\r\n code: string | null = null;\r\n expireInfinity: boolean = false;\r\n expireTime: Date | null = null;\r\n\r\n //当前正在查看的文件夹\r\n dirMatter: Matter = new Matter();\r\n //当前share对应的matters\r\n matters: Matter[] = [];\r\n\r\n //当前分享正在查看的根目录matter的uuid。前端辅助字段。\r\n rootUuid: string = Matter.MATTER_ROOT;\r\n\r\n //本地临时字段\r\n expireOption: ShareExpireOption = ShareExpireOption.MONTH;\r\n\r\n static URL_CREATE = \"/api/share/create\";\r\n static URL_BROWSE = \"/api/share/browse\";\r\n static URL_DELETE_BATCH = \"/api/share/delete/batch\";\r\n static URL_ZIP = \"/api/share/zip\";\r\n\r\n constructor(reactComponent?: React.Component) {\r\n super(reactComponent);\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n super.assignEntity(\"expireTime\", Date);\r\n super.assignEntity(\"dirMatter\", Matter);\r\n super.assignList(\"matters\", Matter);\r\n }\r\n\r\n getUrlPrefix() {\r\n return \"/api/share\";\r\n }\r\n\r\n getFilters() {\r\n return [...super.getFilters()];\r\n }\r\n\r\n getForm() {\r\n return {\r\n name: this.name,\r\n uuid: this.uuid ? this.uuid : null,\r\n };\r\n }\r\n\r\n getIcon() {\r\n if (this.shareType === ShareType.MIX) {\r\n return require(\"../../../assets/image/file/archive.svg\");\r\n } else {\r\n return FileUtil.getIcon(\r\n this.name,\r\n this.shareType === ShareType.DIRECTORY\r\n );\r\n }\r\n }\r\n\r\n getLink() {\r\n return EnvUtil.currentHost() + \"/share/detail/\" + this.uuid;\r\n }\r\n\r\n hasExpired() {\r\n if (this.expireInfinity) {\r\n return false;\r\n } else {\r\n if (this.expireTime) {\r\n return new Date(this.expireTime).getTime() < new Date().getTime();\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n //获取过期时间\r\n getExpireTime() {\r\n const delta = ShareExpireOptionMap[this.expireOption].deltaMillisecond;\r\n const now = new Date();\r\n return new Date(now.getTime() + delta);\r\n }\r\n\r\n //下载zip包\r\n downloadZip(puuid?: string) {\r\n window.open(\r\n `${EnvUtil.currentHost()}${Share.URL_ZIP}?shareUuid=${this.uuid}&code=${\r\n this.code\r\n }&puuid=${puuid}&rootUuid=${this.rootUuid}`\r\n );\r\n }\r\n\r\n //创建一个分享matterUuids要求为数组,expireTime要求为时间对象\r\n httpCreate(\r\n matterUuids: string,\r\n successCallback?: () => any,\r\n errorCallback?: () => any\r\n ) {\r\n let that = this;\r\n\r\n const form = {\r\n matterUuids: matterUuids,\r\n expireInfinity: this.expireOption === ShareExpireOption.INFINITY,\r\n expireTime: DateUtil.simpleDateTime(this.getExpireTime()),\r\n };\r\n\r\n this.httpPost(\r\n Share.URL_CREATE,\r\n form,\r\n function (response: any) {\r\n that.assign(response.data.data);\r\n SafeUtil.safeCallback(successCallback)(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpDeleteBatch(\r\n uuids: string,\r\n successCallback?: () => any,\r\n errorCallback?: () => any\r\n ) {\r\n this.httpPost(\r\n Share.URL_DELETE_BATCH,\r\n { uuids: uuids },\r\n function (response: any) {\r\n SafeUtil.safeCallback(successCallback)(response);\r\n },\r\n errorCallback\r\n );\r\n }\r\n\r\n httpBrowse(\r\n puuid: string,\r\n rootUuid: string,\r\n successCallback?: () => any,\r\n errorCallback?: () => any\r\n ) {\r\n let that = this;\r\n\r\n const form = {\r\n puuid,\r\n rootUuid,\r\n shareUuid: this.uuid,\r\n code: this.code,\r\n };\r\n\r\n this.detailLoading = true;\r\n this.httpPost(\r\n Share.URL_BROWSE,\r\n form,\r\n function (response: any) {\r\n that.assign(response.data.data);\r\n that.detailLoading = false;\r\n SafeUtil.safeCallback(successCallback)(response);\r\n },\r\n function (errorMsg: any) {\r\n that.detailLoading = false;\r\n MessageBoxUtil.error(errorMsg);\r\n SafeUtil.safeCallback(errorCallback)(errorMsg);\r\n }\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport { Modal, Button, Col, Row, Select } from \"antd\";\r\nimport { ExclamationCircleFilled } from \"@ant-design/icons\";\r\nimport \"./ShareOperationModal.less\";\r\nimport Share from \"../../../common/model/share/Share\";\r\nimport {\r\n ShareExpireOptionList,\r\n ShareExpireOption,\r\n} from \"../../../common/model/share/ShareExpireOption\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n onSuccess: (share: Share) => any;\r\n onClose: () => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class ShareOperationModal extends TankComponent {\r\n share = new Share();\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n static open = (confirmCallback: (share: Share) => any) => {\r\n const modal = Modal.confirm({\r\n className: \"share-modal\",\r\n title: Lang.t(\"matter.share\"),\r\n icon: ,\r\n width: \"90vw\",\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\",\r\n },\r\n content: (\r\n {\r\n confirmCallback(share);\r\n modal.destroy();\r\n }}\r\n onClose={() => {\r\n modal.destroy();\r\n }}\r\n />\r\n ),\r\n });\r\n };\r\n\r\n selectChange = (value: ShareExpireOption) => {\r\n this.share.expireOption = value;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { share } = this;\r\n return (\r\n
\r\n \r\n {Lang.t(\"matter.expire\")}\r\n \r\n \r\n {ShareExpireOptionList.map((option) => (\r\n \r\n {Lang.t(option.name)}\r\n \r\n ))}\r\n \r\n \r\n \r\n
\r\n this.props.onSuccess(share)}\r\n >\r\n {Lang.t(\"matter.share\")}\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport Share from \"../../../common/model/share/Share\";\r\nimport {Button, Modal} from \"antd\";\r\nimport { CopyOutlined, ExclamationCircleFilled } from \"@ant-design/icons\";\r\nimport DateUtil from \"../../../common/util/DateUtil\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport './ShareDialogModal.less';\r\nimport ClipboardUtil from \"../../../common/util/ClipboardUtil\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n share: Share;\r\n onSuccess: () => any;\r\n onClose: () => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class ShareDialogModal extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n clipboard = (text: string) => {\r\n ClipboardUtil.copy(text, () => {\r\n MessageBoxUtil.success(Lang.t(\"copySuccess\"));\r\n })\r\n };\r\n\r\n copyAll = () => {\r\n const { share } = this.props;\r\n const text = `${Lang.t(\"share.link\")}:${share.getLink()} ${Lang.t(\"share.code\")}:${share.code}`;\r\n this.clipboard(text);\r\n };\r\n\r\n static open = (share: Share) => {\r\n let modal = Modal.confirm({\r\n className: \"share-modal\",\r\n title: Lang.t(\"share.shareDetail\"),\r\n icon: ,\r\n width: \"90vw\",\r\n okCancel: false,\r\n okButtonProps: {\r\n className: \"display-none\",\r\n },\r\n maskClosable: true,\r\n content: (\r\n {\r\n modal.destroy();\r\n }}\r\n onClose={() => {\r\n modal.destroy();\r\n }}\r\n />\r\n ),\r\n\r\n });\r\n };\r\n\r\n render() {\r\n const { share } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n {share.name}\r\n
\r\n
\r\n {Lang.t(\"share.sharer\")}:{share.username}\r\n \r\n {share.expireInfinity\r\n ? Lang.t(\"share.noExpire\")\r\n : `${Lang.t(\"share.expireTime\")}:${DateUtil.simpleDateHourMinute(\r\n share.expireTime\r\n )}`}\r\n \r\n
\r\n
\r\n {Lang.t(\"share.link\")}:{share.getLink()}\r\n this.clipboard(share.getLink())}\r\n />\r\n
\r\n
\r\n {Lang.t(\"share.code\")}:{share.code}\r\n this.clipboard(share.code!)}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport {Breadcrumb} from 'antd';\r\nimport \"./TableEmpty.less\"\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport BreadcrumbModel from \"../../common/model/base/option/BreadcrumbModel\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport {HomeOutlined} from \"@ant-design/icons/lib\";\r\n\r\ninterface IProps {\r\n breadcrumbModels: BreadcrumbModel[]\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class BreadcrumbPanel extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n \r\n\r\n \r\n {\r\n Sun.navigateTo(\"/\")\r\n }}/>\r\n \r\n\r\n {\r\n this.props.breadcrumbModels.map((item: BreadcrumbModel, index: number) => {\r\n if (item.displayDirect) {\r\n return (\r\n {item.name}\r\n )\r\n } else {\r\n return (\r\n \r\n {\r\n Sun.navigateQueryTo({\r\n path: item.path,\r\n query: item.query\r\n })\r\n }}>{item.name}\r\n \r\n )\r\n }\r\n })\r\n }\r\n \r\n )\r\n }\r\n}\r\n\r\n","import './MatterSortPanel.less'\nimport React from \"react\";\nimport Matter from \"../../../common/model/matter/Matter\";\nimport TankComponent from \"../../../common/component/TankComponent\";\nimport SortDirection from \"../../../common/model/base/SortDirection\";\nimport {ArrowDownOutlined, ArrowUpOutlined,} from \"@ant-design/icons\";\nimport Pager from \"../../../common/model/base/Pager\";\n\ninterface IProps {\n pager: Pager,\n refresh: () => any\n}\n\ninterface IState {\n}\n\nexport default class MatterSortPanel extends TankComponent {\n\n static sortAutomaton = [SortDirection.ASC, SortDirection.DESC, null]; // 排序状态自动机:ASC -> DESC -> null -> ASC...\n\n changeFilterOrder = (orderName: string) => {\n const {pager} = this.props;\n [\"orderName\", \"orderSize\", \"orderUpdateTime\"]\n .filter((name) => name !== orderName)\n .forEach((key) => {\n pager.setFilterValue(key, null);\n });\n const filter = pager.getFilterValue(orderName);\n const nextSortIndex = (MatterSortPanel.sortAutomaton.findIndex((key) => key === filter) + 1) % 3;\n\n pager.resetSortFilters()\n pager.setFilterValue(\"orderDir\", SortDirection.DESC);\n pager.setFilterValue(orderName, MatterSortPanel.sortAutomaton[nextSortIndex]);\n this.props.refresh();\n };\n\n render() {\n const {pager} = this.props;\n\n return (\n
\n this.changeFilterOrder(\"orderName\")}\n >\n 文件名\n {pager.getFilterValue(\"orderName\") ? (\n pager.getFilterValue(\"orderName\") === SortDirection.ASC ? (\n \n ) : (\n \n )\n ) : null}\n
\n this.changeFilterOrder(\"orderSize\")}\n >\n 大小\n {pager.getFilterValue(\"orderSize\") ? (\n pager.getFilterValue(\"orderSize\") === SortDirection.ASC ? (\n \n ) : (\n \n )\n ) : null}\n \n this.changeFilterOrder(\"orderUpdateTime\")}\n >\n 修改日期\n {pager.getFilterValue(\"orderUpdateTime\") ? (\n pager.getFilterValue(\"orderUpdateTime\") === SortDirection.ASC ? (\n \n ) : (\n \n )\n ) : null}\n \n \n );\n }\n}\n","import React, {Children} from \"react\";\nimport {RouteComponentProps} from \"react-router-dom\";\nimport \"./List.less\";\nimport TankComponent from \"../../common/component/TankComponent\";\nimport Pager from \"../../common/model/base/Pager\";\nimport Matter from \"../../common/model/matter/Matter\";\nimport Moon from \"../../common/model/global/Moon\";\nimport Director from \"./widget/Director\";\nimport SortDirection from \"../../common/model/base/SortDirection\";\nimport MatterPanel from \"./widget/MatterPanel\";\nimport UploadMatterPanel from \"./widget/UploadMatterPanel\";\nimport {\n Button,\n Col,\n Empty,\n Input,\n Modal,\n Pagination,\n Row,\n Space,\n Upload,\n} from \"antd\";\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\nimport {\n CloudUploadOutlined,\n DeleteOutlined,\n DownloadOutlined,\n DragOutlined,\n ExclamationCircleFilled,\n FolderOutlined,\n MinusSquareOutlined,\n PlusSquareOutlined,\n ShareAltOutlined,\n SyncOutlined,\n} from \"@ant-design/icons\";\nimport ImagePreviewer from \"../widget/previewer/ImagePreviewer\";\nimport Sun from \"../../common/model/global/Sun\";\nimport {UserRole} from \"../../common/model/user/UserRole\";\nimport StringUtil from \"../../common/util/StringUtil\";\nimport MoveBatchModal from \"./widget/MoveBatchModal\";\nimport ShareOperationModal from \"./widget/ShareOperationModal\";\nimport MatterDeleteModal from \"./widget/MatterDeleteModal\";\nimport Share from \"../../common/model/share/Share\";\nimport ShareDialogModal from \"../share/widget/ShareDialogModal\";\nimport BreadcrumbModel from \"../../common/model/base/option/BreadcrumbModel\";\nimport BreadcrumbPanel from \"../widget/BreadcrumbPanel\";\nimport Lang from \"../../common/model/global/Lang\";\nimport FileUtil from \"../../common/util/FileUtil\";\nimport SafeUtil from \"../../common/util/SafeUtil\";\nimport MatterSortPanel from \"./widget/MatterSortPanel\";\n\ninterface IProps extends RouteComponentProps {\n}\n\ninterface IState {\n}\n\nexport default class List extends TankComponent {\n //当前文件夹信息。\n matter = new Matter();\n //准备新建的文件。\n newMatter = new Matter();\n\n //当前选中的文件\n selectedMatters: Matter[] = [];\n //搜索的文字\n searchText: string | null = null;\n //获取分页的一个帮助器\n pager = new Pager(this, Matter, Pager.MAX_PAGE_SIZE);\n user = Moon.getSingleton().user;\n preference = Moon.getSingleton().preference;\n //导演\n director = new Director();\n //当前面包屑模型数组。\n breadcrumbModels: BreadcrumbModel[] = [];\n //分享\n share = new Share();\n\n newMatterRef = React.createRef();\n //用来判断是否展示遮罩层\n dragEnterCount = 0;\n\n //临时文件list,用于上传文件夹功能\n tempUploadList: File[] = [];\n\n //上传错误日志\n uploadErrorLogs: [string, string, string][] = [];\n\n //准备上传的一系列文件\n static uploadMatters: Matter[] = [];\n\n //持有全局唯一的实例。\n static instance: List | null = null\n\n constructor(props: IProps) {\n super(props);\n\n List.instance = this\n }\n\n //拖拽上传\n drag = {\n dragEnterListener: (e: DragEvent) => {\n e.preventDefault();\n this.dragEnterCount++;\n if (this.dragEnterCount > 0) this.updateUI();\n },\n dragleaveListener: (e: DragEvent) => {\n e.preventDefault();\n this.dragEnterCount--;\n if (this.dragEnterCount <= 0) this.updateUI();\n },\n dragoverListener: (e: DragEvent) => {\n e.preventDefault();\n },\n dropListener: (e: DragEvent) => {\n e.preventDefault();\n this.dragEnterCount = 0;\n this.launchUpload(e.dataTransfer!.files);\n this.updateUI();\n },\n register: () => {\n const {\n dragEnterListener,\n dragleaveListener,\n dragoverListener,\n dropListener,\n } = this.drag;\n const el = document.getElementById(\"layout-content\")!;\n el.addEventListener(\"dragenter\", dragEnterListener);\n el.addEventListener(\"dragleave\", dragleaveListener);\n el.addEventListener(\"dragover\", dragoverListener);\n el.addEventListener(\"drop\", dropListener);\n },\n remove: () => {\n const {\n dragEnterListener,\n dragleaveListener,\n dragoverListener,\n dropListener,\n } = this.drag;\n const el = document.getElementById(\"layout-content\")!;\n el.removeEventListener(\"dragenter\", dragEnterListener);\n el.removeEventListener(\"dragleave\", dragleaveListener);\n el.removeEventListener(\"dragover\", dragoverListener);\n el.removeEventListener(\"drop\", dropListener);\n },\n };\n\n componentDidMount() {\n\n //刷新一下列表\n if (this.user.role === UserRole.ADMINISTRATOR) {\n this.pager.getFilter(\"userUuid\")!.visible = true;\n } else {\n this.pager.setFilterValue(\"userUuid\", this.user.uuid);\n }\n this.pager.enableHistory();\n this.refresh();\n this.drag.register();\n }\n\n componentWillReceiveProps(nextProps: Readonly, nextContext: any) {\n if (this.props.location.search !== nextProps.location.search) {\n this.pager.enableHistory();\n this.refresh();\n }\n }\n\n componentWillUnmount() {\n this.drag.remove();\n }\n\n refresh = () => {\n // 清空暂存区\n this.selectedMatters = [];\n // 刷新文件列表\n this.refreshPager();\n // 刷新面包屑\n this.refreshBreadcrumbs();\n };\n\n refreshPager = () => {\n // 初始化当前matter uuid\n if (this.matter.uuid !== this.pager.getFilterValue(\"puuid\")) {\n this.matter.uuid =\n this.pager.getFilterValue(\"puuid\") || Matter.MATTER_ROOT;\n }\n\n this.pager.setFilterValue(\"puuid\", this.matter.uuid);\n\n //如果没有任何的排序,默认使用时间倒序和文件夹在顶部\n if (!this.pager.getCurrentSortFilter()) {\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\n this.pager.setFilterValue(\"orderDir\", SortDirection.DESC);\n }\n\n // 过滤掉被软删除的文件\n this.pager.setFilterValue(\"deleted\", false);\n\n this.pager.httpList();\n };\n\n checkMatter = (matter?: Matter) => {\n if (matter) {\n if (matter.check) {\n this.selectedMatters.push(matter);\n } else {\n const index = this.selectedMatters.findIndex(\n (item) => item.uuid === matter.uuid\n );\n this.selectedMatters.splice(index, 1);\n }\n } else {\n //统计所有的勾选\n this.selectedMatters = [];\n this.pager.data.forEach((matter) => {\n if (matter.check) {\n this.selectedMatters.push(matter);\n }\n });\n }\n this.updateUI();\n };\n\n checkAll = () => {\n this.pager.data.forEach((i) => {\n i.check = true;\n });\n this.checkMatter();\n };\n\n checkNone = () => {\n this.pager.data.forEach((i) => {\n i.check = false;\n });\n this.checkMatter();\n };\n\n deleteBatch = () => {\n const uuids = this.selectedMatters.map((i) => i.uuid).toString();\n MatterDeleteModal.open(\n () => {\n this.matter.httpSoftDeleteBatch(uuids, () => {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n this.refresh();\n });\n },\n () => {\n this.matter.httpDeleteBatch(uuids, () => {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n this.refresh();\n });\n }\n );\n };\n\n downloadZip = () => {\n const uuids = this.selectedMatters.map((i) => i.uuid).toString();\n Matter.downloadZip(uuids);\n };\n\n toggleMoveBatch = () => {\n MoveBatchModal.open((targetUuid) => {\n const uuids = this.selectedMatters.map((i) => i.uuid).join(\",\");\n this.matter.httpMove(uuids, targetUuid, () => {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n this.refresh();\n });\n });\n };\n\n triggerUpload = (fileObj: any) => {\n const {file} = fileObj;\n if (file) this.launchUpload(file);\n };\n\n debounce = (func: Function, wait: number) => {\n let timer: any = null;\n return (fileObj: any) => {\n const {file} = fileObj;\n this.tempUploadList.push(file);\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(func, wait);\n };\n };\n\n triggerUploadDir = this.debounce(async () => {\n await this.uploadDirectory();\n if (!this.uploadErrorLogs.length) {\n MessageBoxUtil.success(Lang.t(\"matter.uploaded\"));\n } else {\n // 上传错误弹出提示框\n const url = FileUtil.getErrorLogsToCSVUrl(this.uploadErrorLogs);\n Modal.confirm({\n title: Lang.t(\"matter.uploadInfo\"),\n icon: ,\n content: Lang.t(\"matter.uploadErrorInfo\"),\n okText: Lang.t(\"matter.exportCSV\"),\n onOk: () => {\n if (url) {\n window.open(url);\n } else {\n MessageBoxUtil.warn(Lang.t(\"matter.unCompatibleBrowser\"));\n }\n },\n });\n }\n this.tempUploadList = [];\n this.uploadErrorLogs = [];\n this.refresh();\n }, 0);\n\n uploadDirectory = async () => {\n const dirPathUuidMap: any = {}; // 存储已经创建好的文件夹map\n for (let i = 0; i < this.tempUploadList.length; i++) {\n const file: File = this.tempUploadList[i];\n const paths = file.webkitRelativePath.split(\"/\");\n const pPaths = paths.slice(0, paths.length - 1);\n const pPathStr = pPaths.join(\"/\");\n if (!dirPathUuidMap[pPathStr]) {\n // 递归创建其父文件夹\n for (let j = 1; j <= pPaths.length; j++) {\n const midPaths = pPaths.slice(0, j);\n const midPathStr = midPaths.join(\"/\");\n if (!dirPathUuidMap[midPathStr]) {\n const m = new Matter(this);\n m.name = midPaths[midPaths.length - 1];\n m.puuid =\n j > 1\n ? dirPathUuidMap[midPaths.slice(0, j - 1).join(\"/\")]\n : this.matter.uuid!;\n m.userUuid = this.user.uuid!;\n await m.httpCreateDirectory(\n () => {\n dirPathUuidMap[midPathStr] = m.uuid;\n },\n (msg: string) => {\n this.uploadErrorLogs.push([\n file.name,\n file.webkitRelativePath,\n msg,\n ]);\n }\n );\n }\n }\n }\n if (dirPathUuidMap[pPathStr]) {\n this.launchUpload(file, dirPathUuidMap[pPathStr], (msg?: string) => {\n this.uploadErrorLogs.push([\n file.name,\n file.webkitRelativePath,\n `${msg}`,\n ]);\n });\n }\n }\n };\n\n launchUpload = (\n f: File | FileList,\n puuid = this.matter.uuid!,\n errHandle = () => {\n }\n ) => {\n const files = f instanceof FileList ? f : [f];\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const m = new Matter(this);\n m.dir = false;\n m.puuid = puuid;\n m.userUuid = this.user.uuid!;\n\n //判断文件大小。\n if (this.user.sizeLimit >= 0) {\n if (file.size > this.user.sizeLimit) {\n MessageBoxUtil.error(\n Lang.t(\n \"matter.sizeExceedLimit\",\n StringUtil.humanFileSize(file.size),\n StringUtil.humanFileSize(this.user.sizeLimit)\n )\n );\n }\n }\n m.file = file;\n m.httpUpload(\n () => {\n const index = List.uploadMatters.findIndex((matter) => matter === m);\n List.uploadMatters.splice(index, 1);\n List.instance!.refresh();\n },\n (msg: string) => {\n List.instance!.updateUI();\n SafeUtil.safeCallback(errHandle)(msg);\n }\n );\n\n List.uploadMatters.push(m);\n }\n };\n\n shareBatch = () => {\n const uuids = this.selectedMatters.map((i) => i.uuid).join(\",\");\n ShareOperationModal.open((share: Share) => {\n share.httpCreate(uuids, () => {\n ShareDialogModal.open(share);\n });\n });\n };\n\n searchFile = (value?: string) => {\n this.pager.resetFilter();\n if (value) {\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\n this.pager.setFilterValue(\"orderDir\", SortDirection.DESC);\n this.pager.setFilterValue(\"name\", value);\n this.pager.httpList();\n } else {\n this.refresh();\n }\n };\n\n changeSearch = (e: any) => {\n if (!e.currentTarget.value) this.searchFile();\n };\n\n changePage = (page: number) => {\n this.pager.page = page - 1; // page的页数0基\n this.pager.httpList();\n this.updateUI();\n };\n\n createDirectory = () => {\n this.newMatter.name = \"matter.allFiles\";\n this.newMatter.dir = true;\n this.newMatter.editMode = true;\n this.newMatter.puuid = this.matter.uuid || \"root\";\n this.newMatter.userUuid = this.user.uuid!;\n this.director.createMode = true;\n\n this.updateUI();\n setTimeout(() => this.newMatterRef.current!.highLight());\n };\n\n previewImage = (matter: Matter) => {\n let imageArray: string[] = [];\n let startIndex = -1;\n this.pager.data.forEach((item) => {\n if (item.isImage()) {\n imageArray.push(item.getPreviewUrl());\n if (item.uuid === matter.uuid) {\n startIndex = imageArray.length - 1;\n }\n }\n });\n\n ImagePreviewer.showMultiPhoto(imageArray, startIndex);\n };\n\n goToDirectory = (id: string) => {\n this.searchText = null;\n this.pager.setFilterValue(\"puuid\", id);\n this.pager.page = 0;\n const query = this.pager.getParams();\n Sun.navigateQueryTo({path: \"/matter/list\", query});\n this.refresh();\n };\n\n //刷新面包屑\n refreshBreadcrumbs = () => {\n const uuid = this.pager.getFilterValue(\"puuid\") || Matter.MATTER_ROOT;\n\n //根目录简单处理即可。\n if (uuid === Matter.MATTER_ROOT) {\n this.matter.uuid = Matter.MATTER_ROOT;\n this.breadcrumbModels = [\n {\n name: Lang.t(\"matter.allFiles\"),\n path: \"/matter/list\",\n query: {},\n displayDirect: true,\n },\n ];\n } else {\n this.matter.uuid = uuid;\n this.matter.httpDetail(() => {\n const arr = [];\n let cur: Matter | null = this.matter;\n do {\n arr.push(cur);\n cur = cur.parent;\n } while (cur);\n\n this.breadcrumbModels = arr.reduceRight(\n (t: any, item: Matter, i: number) => {\n const query = this.pager.getParams();\n query[\"puuid\"] = item.uuid!;\n t.push({\n name: item.name,\n path: \"/matter/list\",\n query: query,\n displayDirect: !i, // 当前目录不需要导航\n });\n return t;\n },\n [\n {\n name: Lang.t(\"matter.allFiles\"),\n path: \"/matter/list\",\n query: {},\n displayDirect: false,\n },\n ]\n );\n this.updateUI();\n });\n }\n };\n\n render() {\n const {\n pager,\n director,\n selectedMatters,\n dragEnterCount,\n } = this;\n return (\n
\n {dragEnterCount > 0 ? (\n
\n \n
\n ) : null}\n \n\n \n \n \n {selectedMatters.length !== pager.data.length ? (\n \n ) : null}\n {pager.data.length &&\n selectedMatters.length === pager.data.length ? (\n \n \n {Lang.t(\"cancel\")}\n \n ) : null}\n {selectedMatters.length ? (\n <>\n \n \n {Lang.t(\"delete\")}\n \n\n \n \n {Lang.t(\"download\")}\n \n\n \n \n {Lang.t(\"matter.move\")}\n \n\n \n \n {Lang.t(\"matter.share\")}\n \n \n ) : null}\n\n \n \n \n \n \n \n \n \n {Lang.t(\"matter.create\")}\n \n\n \n \n \n \n this.searchFile(value)}\n onChange={this.changeSearch}\n enterButton\n />\n \n \n\n {Children.toArray(\n List.uploadMatters.map((m) => )\n )}\n\n {pager.data.length ? (\n this.refresh()}/>\n ) : null}\n\n {director.createMode ? (\n \n ) : null}\n
\n {pager.loading || pager.data.length ? (\n pager.data.map((matter) => (\n \n ))\n ) : (\n \n )}\n
\n \n
\n );\n }\n}\n","import BaseEntity from '../../base/BaseEntity'\r\nimport User from \"../../user/User\";\r\nimport Matter from \"../../matter/Matter\";\r\nimport InputFilter from \"../../base/filter/InputFilter\";\r\nimport SafeUtil from \"../../../util/SafeUtil\";\r\n\r\nexport default class ImageCache extends BaseEntity {\r\n\r\n static URL_DELETE_BATCH = '/api/image/cache/delete/batch';\r\n\r\n name: string | null = null;\r\n userUuid: string | null = null;\r\n matterUuid: string | null = null;\r\n matterName: string | null = null;\r\n mode: string | null = null;\r\n md5: string | null = null;\r\n size: number = 0;\r\n path: number = 0;\r\n\r\n /*\r\n 这部分是辅助UI的字段信息\r\n */\r\n //作为勾选变量\r\n check: boolean = false;\r\n\r\n user: User = new User();\r\n matter: Matter = new Matter();\r\n\r\n constructor(reactComponent?: React.Component) {\r\n super(reactComponent);\r\n }\r\n\r\n getUrlPrefix() {\r\n return \"/api/image/cache\"\r\n }\r\n\r\n assign(obj: any) {\r\n super.assign(obj);\r\n }\r\n\r\n getFilters() {\r\n return [\r\n ...super.getFilters(),\r\n new InputFilter(\"User Uuid\", \"userUuid\", null, false),\r\n new InputFilter(\"File Uuid\", \"matterUuid\", null, false),\r\n ]\r\n }\r\n\r\n getForm() {\r\n return {\r\n uuid: this.uuid ? this.uuid : null\r\n }\r\n }\r\n\r\n getResizeUrl() {\r\n return '/api/alien/preview/' + this.matterUuid + '/' + this.matterName + \"?ir=\" + this.mode\r\n }\r\n\r\n getOriginUrl() {\r\n return '/api/alien/download/' + this.matterUuid + '/' + this.matterName\r\n }\r\n\r\n\r\n httpDeleteBatch(uuids: string, successCallback?: () => any, errorCallback?: () => any) {\r\n this.httpPost(ImageCache.URL_DELETE_BATCH, {'uuids': uuids}, function (response: any) {\r\n SafeUtil.safeCallback(successCallback)(response)\r\n }, errorCallback)\r\n }\r\n\r\n\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../../../common/component/TankComponent\";\r\nimport { Checkbox, Modal } from \"antd\";\r\nimport SafeUtil from \"../../../../common/util/SafeUtil\";\r\nimport ImageCache from \"../../../../common/model/image/cache/ImageCache\";\r\nimport ImageUtil from \"../../../../common/util/ImageUtil\";\r\nimport { CheckboxChangeEvent } from \"antd/es/checkbox\";\r\nimport {\r\n DeleteOutlined,\r\n ExclamationCircleFilled,\r\n SmallDashOutlined,\r\n} from \"@ant-design/icons\";\r\nimport MessageBoxUtil from \"../../../../common/util/MessageBoxUtil\";\r\nimport FileUtil from \"../../../../common/util/FileUtil\";\r\nimport DateUtil from \"../../../../common/util/DateUtil\";\r\nimport Expanding from \"../../../widget/Expanding\";\r\nimport \"./ImageCachePanel.less\";\r\nimport StringUtil from \"../../../../common/util/StringUtil\";\r\nimport Lang from \"../../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n imageCache: ImageCache;\r\n onCheckImageCache: (imageCache?: ImageCache) => any;\r\n onPreviewImageCache: (imageCache: ImageCache) => any;\r\n onDeleteSuccess: () => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class ImageCachePanel extends TankComponent {\r\n //正在向服务器提交rename的请求\r\n renamingLoading = false;\r\n // 小屏幕下操作栏\r\n showMore = false;\r\n\r\n checkToggle = (e: CheckboxChangeEvent) => {\r\n const { imageCache, onCheckImageCache } = this.props;\r\n imageCache.check = e.target.checked;\r\n onCheckImageCache(imageCache);\r\n };\r\n\r\n deleteImageCache = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionCanNotRevertConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n this.props.imageCache.httpDel(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onDeleteSuccess!();\r\n });\r\n },\r\n });\r\n };\r\n\r\n toggleHandles = () => {\r\n this.showMore = !this.showMore;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { imageCache } = this.props;\r\n\r\n return (\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n this.props.onPreviewImageCache(imageCache)\r\n )\r\n }\r\n >\r\n
\r\n
\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)}\r\n checked={imageCache.check}\r\n onChange={this.checkToggle}\r\n />\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n {/*在大屏下的操作栏*/}\r\n
\r\n {imageCache.uuid ? (\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.deleteImageCache())\r\n }\r\n />\r\n \r\n {FileUtil.humanFileSize(imageCache.size)}\r\n \r\n \r\n {DateUtil.simpleDateHourMinute(imageCache.updateTime)}\r\n \r\n
\r\n ) : null}\r\n
\r\n\r\n {/*在小屏下的操作栏*/}\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.toggleHandles())\r\n }\r\n >\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n {imageCache.name}\r\n
\r\n
\r\n
\r\n \r\n {this.showMore ? (\r\n
\r\n
\r\n \r\n {DateUtil.simpleDateHourMinute(imageCache.updateTime)}\r\n \r\n \r\n {StringUtil.humanFileSize(imageCache.size)}\r\n \r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.deleteImageCache())\r\n }\r\n >\r\n \r\n {Lang.t(\"delete\")}\r\n
\r\n
\r\n ) : null}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\nimport {Button, Empty, Modal, Pagination, Space} from \"antd\";\nimport Pager from \"../../../../common/model/base/Pager\";\nimport ImageCache from \"../../../../common/model/image/cache/ImageCache\";\nimport TankComponent from \"../../../../common/component/TankComponent\";\nimport ImageCachePanel from \"./ImageCachePanel\";\nimport ImagePreviewer from \"../../../widget/previewer/ImagePreviewer\";\nimport MessageBoxUtil from \"../../../../common/util/MessageBoxUtil\";\nimport {DeleteOutlined, ExclamationCircleFilled, MinusSquareOutlined, PlusSquareOutlined} from \"@ant-design/icons\";\nimport TankTitle from \"../../../widget/TankTitle\";\nimport Lang from \"../../../../common/model/global/Lang\";\nimport TankContentCard from \"../../../widget/TankContentCard\";\n\ninterface IProps {\n initFilter: any;\n}\n\ninterface IState {\n}\n\nexport default class ImageCacheList extends TankComponent {\n selectedImageCaches: ImageCache[] = [];\n pager = new Pager(this, ImageCache, 2);\n\n constructor(props: IProps) {\n super(props);\n this.state = {};\n this.pager.enableHistory()\n }\n\n componentDidMount() {\n this.refresh();\n }\n\n deleteBatch = () => {\n Modal.confirm({\n title: Lang.t(\"actionCanNotRevertConfirm\"),\n icon: ,\n onOk: () => {\n const uuids = this.selectedImageCaches.map((i) => i.uuid).toString();\n const imageCache = new ImageCache();\n imageCache.httpDeleteBatch(uuids, () => {\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\n this.refresh();\n });\n },\n });\n };\n\n checkBatch = (check: boolean) => {\n this.pager.data.forEach((i) => {\n i.check = check;\n });\n this.checkImageCache();\n };\n\n refresh = () => {\n const {initFilter} = this.props;\n if (initFilter) {\n for (let key in initFilter) {\n if (initFilter.hasOwnProperty(key)) {\n this.pager.setFilterValue(key, initFilter[key]);\n }\n }\n }\n this.pager.page = 0;\n this.pager.httpList();\n this.selectedImageCaches = [];\n };\n\n checkImageCache = (imageCache?: ImageCache) => {\n if (imageCache) {\n if (imageCache.check) {\n this.selectedImageCaches.push(imageCache);\n } else {\n const index = this.selectedImageCaches.findIndex(\n (item) => item.uuid === imageCache.uuid\n );\n this.selectedImageCaches.splice(index, 1);\n }\n } else {\n this.selectedImageCaches.splice(0, this.selectedImageCaches.length);\n this.pager.data.forEach((imageCache) => {\n if (imageCache.check) {\n this.selectedImageCaches.push(imageCache);\n }\n });\n }\n this.updateUI();\n };\n\n previewImageCache = (imageCache: ImageCache) => {\n //从matter开始预览图片\n const imageArray: string[] = [];\n let startIndex = -1;\n this.pager.data.forEach((item) => {\n imageArray.push(item.getResizeUrl());\n if (item.uuid === imageCache.uuid) {\n startIndex = imageArray.length - 1;\n }\n });\n\n ImagePreviewer.showMultiPhoto(imageArray, startIndex);\n };\n\n changePage = (page: number) => {\n this.pager.page = page - 1; // page的页数0基\n this.pager.httpList();\n this.updateUI();\n };\n\n render() {\n const {selectedImageCaches, pager} = this;\n if (!pager.data.length) return ;\n return (\n
\n \n \n {selectedImageCaches.length ? (\n \n ) : null}\n {selectedImageCaches.length !== pager.data.length ? (\n \n ) : null}\n {pager.data.length &&\n selectedImageCaches.length === pager.data.length ? (\n \n ) : null}\n \n
\n }\n />\n\n \n {pager.data.map((imageCache) => (\n \n ))}\n\n \n\n \n\n \n );\n }\n}\n","import React from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport \"./Detail.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport Matter from \"../../common/model/matter/Matter\";\r\nimport { Space, Spin, Tag } from \"antd\";\r\nimport StringUtil from \"../../common/util/StringUtil\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport DownloadToken from \"../../common/model/download/token/DownloadToken\";\r\nimport DateUtil from \"../../common/util/DateUtil\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport ImageCacheList from \"./widget/imageCache/ImageCacheList\";\r\nimport ClipboardUtil from \"../../common/util/ClipboardUtil\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport InfoCell from \"../widget/InfoCell\";\r\nimport TankContentCard from \"../widget/TankContentCard\";\r\nimport Color from \"../../common/model/base/option/Color\";\r\n\r\ninterface RouteParam {\r\n uuid: string;\r\n}\r\n\r\ninterface IProps extends RouteComponentProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class Detail extends TankComponent {\r\n matter = new Matter();\r\n downloadToken = new DownloadToken();\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n const { uuid } = this.props.match.params;\r\n this.matter.uuid = uuid;\r\n let that = this;\r\n this.matter.httpDetail((response: any) => {\r\n that.updateUI();\r\n if (!response.data.data.dir) {\r\n that.downloadToken.httpFetchDownloadToken(that.matter.uuid!);\r\n }\r\n });\r\n }\r\n\r\n copyLink = () => {\r\n const { privacy } = this.matter;\r\n const textToCopy = this.matter.getDownloadUrl(\r\n privacy ? this.downloadToken.uuid! : undefined\r\n );\r\n ClipboardUtil.copy(textToCopy, () => {\r\n MessageBoxUtil.success(Lang.t(\"copySuccess\"));\r\n });\r\n };\r\n\r\n recovery = () => {\r\n this.matter.httpRecovery(() => {\r\n this.matter.httpDetail(() => {\r\n this.updateUI();\r\n });\r\n MessageBoxUtil.success(Lang.t(\"copySuccess\"));\r\n });\r\n };\r\n\r\n render() {\r\n const { matter } = this;\r\n return (\r\n \r\n
\r\n \r\n\r\n \r\n
\r\n \r\n {matter.name}\r\n {matter.deleted && (\r\n \r\n {Lang.t(\"matter.deleted\")}\r\n \r\n )}\r\n \r\n {matter.path}\r\n \r\n {DateUtil.simpleDateTime(matter.createTime)}\r\n \r\n \r\n {DateUtil.simpleDateTime(matter.updateTime)}\r\n \r\n {matter.deleted && (\r\n \r\n {DateUtil.simpleDateTime(matter.deleteTime)}\r\n \r\n )}\r\n \r\n {StringUtil.humanFileSize(matter.size)}\r\n \r\n {!matter.dir ? (\r\n <>\r\n \r\n {matter.privacy\r\n ? Lang.t(\"matter.privateInfo\")\r\n : Lang.t(\"matter.publicInfo\")}\r\n \r\n \r\n {matter.times}\r\n \r\n \r\n \r\n matter.download()}>\r\n {Lang.t(\"matter.download\")}\r\n \r\n matter.preview()}>\r\n {Lang.t(\"matter.preview\")}\r\n \r\n \r\n {matter.privacy\r\n ? Lang.t(\"matter.oneTimeLink\")\r\n : Lang.t(\"matter.copyPath\")}\r\n \r\n {matter.deleted ? (\r\n \r\n {Lang.t(\"matter.recovery\")}\r\n \r\n ) : null}\r\n \r\n \r\n \r\n ) : null}\r\n {matter.dir && matter.deleted && (\r\n \r\n {Lang.t(\"matter.recovery\")}\r\n \r\n )}\r\n
\r\n
\r\n
\r\n\r\n {!matter.dir && matter.uuid && matter.isImage() ? (\r\n \r\n ) : null}\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport \"./List.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport Pager from \"../../common/model/base/Pager\";\r\nimport Matter from \"../../common/model/matter/Matter\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport SortDirection from \"../../common/model/base/SortDirection\";\r\nimport MatterPanel from \"../matter/widget/MatterPanel\";\r\nimport { Button, Col, Empty, Input, Modal, Pagination, Row, Space } from \"antd\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport {\r\n ExclamationCircleFilled,\r\n PlusSquareOutlined,\r\n MinusSquareOutlined,\r\n SyncOutlined,\r\n RedoOutlined,\r\n CloseCircleOutlined,\r\n} from \"@ant-design/icons\";\r\nimport ImagePreviewer from \"../widget/previewer/ImagePreviewer\";\r\nimport { UserRole } from \"../../common/model/user/UserRole\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\n\r\ninterface IProps extends RouteComponentProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class List extends TankComponent {\r\n //当前文件夹信息。\r\n matter = new Matter();\r\n //当前选中的文件\r\n selectedMatters: Matter[] = [];\r\n //获取分页的一个帮助器\r\n pager = new Pager(this, Matter, Pager.MAX_PAGE_SIZE);\r\n user = Moon.getSingleton().user;\r\n preference = Moon.getSingleton().preference;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n //刷新一下列表\r\n if (this.user.role === UserRole.ADMINISTRATOR) {\r\n this.pager.getFilter(\"userUuid\")!.visible = true;\r\n } else {\r\n this.pager.setFilterValue(\"userUuid\", this.user.uuid);\r\n }\r\n this.pager.enableHistory();\r\n this.refresh();\r\n }\r\n\r\n componentWillReceiveProps(nextProps: Readonly, nextContext: any) {\r\n if (this.props.location.search !== nextProps.location.search) {\r\n this.pager.enableHistory();\r\n this.refresh();\r\n }\r\n }\r\n\r\n refresh = () => {\r\n // 清空暂存区\r\n this.selectedMatters = [];\r\n // 刷新文件列表\r\n this.refreshPager();\r\n };\r\n\r\n refreshPager = () => {\r\n //如果没有任何的排序,默认使用时间倒序和文件夹在顶部\r\n if (!this.pager.getCurrentSortFilter()) {\r\n this.pager.setFilterValue(\"orderDeleteTime\", SortDirection.DESC);\r\n this.pager.setFilterValue(\"orderDir\", SortDirection.DESC);\r\n }\r\n\r\n // 过滤掉被软删除的文件\r\n this.pager.setFilterValue(\"deleted\", true);\r\n\r\n this.pager.httpList();\r\n };\r\n\r\n checkMatter = (matter?: Matter) => {\r\n if (matter) {\r\n if (matter.check) {\r\n this.selectedMatters.push(matter);\r\n } else {\r\n const index = this.selectedMatters.findIndex(\r\n (item) => item.uuid === matter.uuid\r\n );\r\n this.selectedMatters.splice(index, 1);\r\n }\r\n } else {\r\n //统计所有的勾选\r\n this.selectedMatters = [];\r\n this.pager.data.forEach((matter) => {\r\n if (matter.check) {\r\n this.selectedMatters.push(matter);\r\n }\r\n });\r\n }\r\n this.updateUI();\r\n };\r\n\r\n checkAll = () => {\r\n this.pager.data.forEach((i) => {\r\n i.check = true;\r\n });\r\n this.checkMatter();\r\n };\r\n\r\n checkNone = () => {\r\n this.pager.data.forEach((i) => {\r\n i.check = false;\r\n });\r\n this.checkMatter();\r\n };\r\n\r\n deleteBatch = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionCanNotRevertConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n const uuids = this.selectedMatters.map((i) => i.uuid).toString();\r\n this.matter.httpDeleteBatch(uuids, () => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.refresh();\r\n });\r\n },\r\n });\r\n };\r\n\r\n recoverBatch = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionRecoveryConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n const uuids = this.selectedMatters.map((i) => i.uuid).toString();\r\n this.matter.httpRecoveryBatch(uuids, () => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.refresh();\r\n });\r\n },\r\n });\r\n };\r\n\r\n searchFile = (value?: string) => {\r\n this.pager.resetFilter();\r\n if (value) {\r\n this.pager.setFilterValue(\"orderCreateTime\", SortDirection.DESC);\r\n this.pager.setFilterValue(\"orderDir\", SortDirection.DESC);\r\n this.pager.setFilterValue(\"name\", value);\r\n this.pager.setFilterValue(\"deleted\", true);\r\n this.pager.httpList();\r\n } else {\r\n this.refresh();\r\n }\r\n };\r\n\r\n changeSearch = (e: any) => {\r\n if (!e.currentTarget.value) this.searchFile();\r\n };\r\n\r\n changePage = (page: number) => {\r\n this.pager.page = page - 1; // page的页数0基\r\n this.pager.httpList();\r\n this.updateUI();\r\n };\r\n\r\n previewImage = (matter: Matter) => {\r\n let imageArray: string[] = [];\r\n let startIndex = -1;\r\n this.pager.data.forEach((item) => {\r\n if (item.isImage()) {\r\n imageArray.push(item.getPreviewUrl());\r\n if (item.uuid === matter.uuid) {\r\n startIndex = imageArray.length - 1;\r\n }\r\n }\r\n });\r\n\r\n ImagePreviewer.showMultiPhoto(imageArray, startIndex);\r\n };\r\n\r\n render() {\r\n const { pager, selectedMatters } = this;\r\n return (\r\n
\r\n \r\n\r\n \r\n \r\n \r\n {selectedMatters.length !== pager.data.length ? (\r\n \r\n ) : null}\r\n {pager.data.length &&\r\n selectedMatters.length === pager.data.length ? (\r\n \r\n \r\n {Lang.t(\"cancel\")}\r\n \r\n ) : null}\r\n {selectedMatters.length ? (\r\n <>\r\n \r\n \r\n {Lang.t(\"matter.recovery\")}\r\n \r\n \r\n \r\n {Lang.t(\"matter.hardDelete\")}\r\n \r\n \r\n ) : null}\r\n\r\n \r\n \r\n \r\n \r\n this.searchFile(value)}\r\n onChange={this.changeSearch}\r\n enterButton\r\n />\r\n \r\n \r\n\r\n
\r\n {pager.loading || pager.data.length ? (\r\n pager.data.map((matter) => (\r\n \r\n ))\r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport {\r\n InfoCircleOutlined,\r\n DeleteOutlined,\r\n SmallDashOutlined,\r\n ExclamationCircleFilled,\r\n} from \"@ant-design/icons\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport DateUtil from \"../../../common/util/DateUtil\";\r\nimport Expanding from \"../../widget/Expanding\";\r\nimport Share from \"../../../common/model/share/Share\";\r\nimport Sun from \"../../../common/model/global/Sun\";\r\nimport \"./ShareBar.less\";\r\nimport { Modal, Tooltip } from \"antd\";\r\nimport MessageBoxUtil from \"../../../common/util/MessageBoxUtil\";\r\nimport ShareDialogModal from \"./ShareDialogModal\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\n\r\ninterface IProps {\r\n share: Share;\r\n onDeleteSuccess: () => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class ShareBar extends TankComponent {\r\n // 小屏幕下操作栏\r\n showMore = false;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n showShare = () => {\r\n ShareDialogModal.open(this.props.share);\r\n };\r\n\r\n delShare = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"actionCanNotRevertConfirm\"),\r\n icon: ,\r\n onOk: () => {\r\n this.props.share.httpDel(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n this.props.onDeleteSuccess();\r\n });\r\n },\r\n });\r\n };\r\n\r\n toggleHandles = () => {\r\n this.showMore = !this.showMore;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { share } = this.props;\r\n const { showMore } = this;\r\n return (\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(\r\n Sun.navigateTo(`/share/detail/${share.uuid}`)\r\n )\r\n }\r\n >\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n {/*在大屏下的操作栏*/}\r\n
\r\n
\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.showShare())\r\n }\r\n />\r\n \r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.delShare())\r\n }\r\n />\r\n \r\n \r\n\r\n \r\n \r\n {DateUtil.simpleDateHourMinute(share.updateTime)}\r\n \r\n \r\n\r\n \r\n \r\n {share.expireInfinity\r\n ? Lang.t(\"share.noExpire\")\r\n : DateUtil.simpleDateHourMinute(share.expireTime)}\r\n \r\n \r\n
\r\n
\r\n\r\n {/*在小屏幕下的操作栏*/}\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.toggleHandles())\r\n }\r\n >\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n {share.name}\r\n {share.hasExpired() ? (\r\n \r\n {Lang.t(\"share.expired\")}\r\n \r\n ) : null}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n {showMore ? (\r\n
\r\n
\r\n \r\n {Lang.t(\"share.shareTime\")}:{\" \"}\r\n {DateUtil.simpleDateHourMinute(share.createTime)}\r\n \r\n \r\n {share.expireInfinity\r\n ? Lang.t(\"share.noExpire\")\r\n : `${Lang.t(\"expireTime\")}:${DateUtil.simpleDateHourMinute(\r\n share.expireTime\r\n )}`}\r\n \r\n
\r\n\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.showShare())\r\n }\r\n >\r\n \r\n {Lang.t(\"share.shareDetail\")}\r\n
\r\n\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.delShare())\r\n }\r\n >\r\n \r\n {Lang.t(\"delete\")}\r\n \r\n \r\n ) : null}\r\n
\r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\nimport {RouteComponentProps} from \"react-router-dom\";\nimport {Empty, Pagination} from \"antd\";\nimport TankTitle from \"../widget/TankTitle\";\nimport TankComponent from \"../../common/component/TankComponent\";\nimport Pager from \"../../common/model/base/Pager\";\nimport Share from \"../../common/model/share/Share\";\nimport ShareBar from \"./widget/ShareBar\";\n\nimport \"./List.less\";\nimport Lang from \"../../common/model/global/Lang\";\n\ninterface IProps extends RouteComponentProps {\n}\n\ninterface IState {\n}\n\nexport default class List extends TankComponent {\n pager = new Pager(this, Share, Pager.MAX_PAGE_SIZE);\n\n constructor(props: IProps) {\n super(props);\n }\n\n componentDidMount() {\n this.pager.enableHistory();\n this.refresh();\n }\n\n refresh = () => {\n this.pager.httpList();\n };\n\n changePage = (page: number) => {\n this.pager.page = page - 1; // page的页数0基\n this.pager.httpList();\n this.updateUI();\n };\n\n render() {\n const {pager} = this;\n\n return (\n
\n \n\n {pager.data.map((share) => (\n \n ))}\n\n \n\n {pager.isEmpty() && (\n \n )}\n\n
\n );\n }\n}\n","import React from 'react';\r\nimport \"./FrameLoading.less\"\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport {LoadingOutlined} from '@ant-design/icons';\r\n\r\ninterface IProps {\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\n/**\r\n * 主站加载控件。\r\n * 在主站加载过程中或者在工作台加载过程中使用\r\n * 该控件采用fixed布局,会占据全屏\r\n */\r\nexport default class FrameLoading extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n 加载中...\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}\r\n","import React from \"react\";\r\nimport Matter from \"../../../common/model/matter/Matter\";\r\nimport TankComponent from \"../../../common/component/TankComponent\";\r\nimport \"./ShareMatterPanel.less\";\r\nimport StringUtil from \"../../../common/util/StringUtil\";\r\nimport DateUtil from \"../../../common/util/DateUtil\";\r\nimport Expanding from \"../../widget/Expanding\";\r\nimport {\r\n UnlockOutlined,\r\n DownloadOutlined,\r\n EllipsisOutlined,\r\n} from \"@ant-design/icons\";\r\nimport { Tooltip } from \"antd\";\r\nimport SafeUtil from \"../../../common/util/SafeUtil\";\r\nimport Lang from \"../../../common/model/global/Lang\";\r\nimport Share from \"../../../common/model/share/Share\";\r\nimport ImageUtil from \"../../../common/util/ImageUtil\";\r\n\r\ninterface IProps {\r\n matter: Matter;\r\n share: Share;\r\n onPreviewImage: (matter: Matter) => any;\r\n onGoToDirectory: (id: string) => any;\r\n}\r\n\r\ninterface IState {}\r\n\r\nexport default class ShareMatterPanel extends TankComponent {\r\n // 小屏幕下操作栏\r\n showMore: boolean = false;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n clickRow = () => {\r\n const { matter, share, onGoToDirectory, onPreviewImage } = this.props;\r\n\r\n if (matter.dir) {\r\n onGoToDirectory(matter.uuid!);\r\n } else {\r\n //图片进行预览操作\r\n if (matter.isImage()) {\r\n onPreviewImage(matter);\r\n } else {\r\n matter.preview(matter.getSharePreviewUrl(share.uuid!, share.code!, share.rootUuid));\r\n }\r\n }\r\n };\r\n\r\n getIcon = () => {\r\n const { matter, share } = this.props;\r\n if (matter.isImage()) {\r\n return ImageUtil.handleImageUrl(matter.getSharePreviewUrl(share.uuid!, share.code!, share.rootUuid), false, 100, 100)\r\n } else {\r\n return matter.getIcon()\r\n }\r\n };\r\n\r\n download = () => {\r\n const { matter, share } = this.props;\r\n matter.download(matter.getShareDownloadUrl(share.uuid!, share.code!, share.rootUuid))\r\n };\r\n\r\n toggleHandles = () => {\r\n this.showMore = !this.showMore;\r\n this.updateUI();\r\n };\r\n\r\n render() {\r\n const { matter } = this.props;\r\n\r\n return (\r\n
\r\n
SafeUtil.stopPropagationWrap(e)(this.clickRow())}>\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n {/*在大屏幕下的操作栏*/}\r\n
\r\n
\r\n \r\n \r\n SafeUtil.stopPropagationWrap(e)(this.download())\r\n }\r\n />\r\n \r\n\r\n \r\n \r\n {StringUtil.humanFileSize(matter.size)}\r\n \r\n \r\n\r\n \r\n \r\n {DateUtil.simpleDateHourMinute(matter.updateTime)}\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.toggleHandles())\r\n }\r\n >\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n {matter.name}\r\n {!matter.dir && !matter.privacy && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n {this.showMore ? (\r\n
\r\n
\r\n {DateUtil.simpleDateHourMinute(matter.updateTime)}\r\n \r\n {StringUtil.humanFileSize(matter.size)}\r\n \r\n
\r\n \r\n SafeUtil.stopPropagationWrap(e)(this.download())\r\n }\r\n >\r\n \r\n {Lang.t(\"matter.download\")}\r\n
\r\n
\r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport TankTitle from \"../widget/TankTitle\";\r\nimport {Button, Col, Empty, Input, Modal, Row, Space} from \"antd\";\r\nimport {RouteComponentProps} from \"react-router\";\r\nimport \"./Detail.less\";\r\nimport Share from \"../../common/model/share/Share\";\r\nimport Pager from \"../../common/model/base/Pager\";\r\nimport Matter from \"../../common/model/matter/Matter\";\r\nimport BrowserUtil from \"../../common/util/BrowserUtil\";\r\nimport SortDirection from \"../../common/model/base/SortDirection\";\r\nimport FrameLoading from \"../widget/FrameLoading\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport MessageBoxUtil from \"../../common/util/MessageBoxUtil\";\r\nimport {DownloadOutlined, ExclamationCircleFilled, LinkOutlined, StopOutlined} from \"@ant-design/icons\";\r\nimport ShareDialogModal from \"./widget/ShareDialogModal\";\r\nimport DateUtil from \"../../common/util/DateUtil\";\r\nimport ShareMatterPanel from \"./widget/ShareMatterPanel\";\r\nimport BreadcrumbModel from \"../../common/model/base/option/BreadcrumbModel\";\r\nimport BreadcrumbPanel from \"../widget/BreadcrumbPanel\";\r\nimport ImagePreviewer from \"../widget/previewer/ImagePreviewer\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\n\r\ninterface RouteParam {\r\n uuid: string;\r\n}\r\n\r\ninterface IProps extends RouteComponentProps {\r\n}\r\n\r\ninterface IState {\r\n}\r\n\r\nexport default class Detail extends TankComponent {\r\n // 默认分享详情中分页大小\r\n static sharePagerSize = 50;\r\n\r\n //当前面包屑模型数组。\r\n breadcrumbModels: BreadcrumbModel[] = [];\r\n\r\n // 是否需要提取码\r\n needShareCode = true;\r\n\r\n share = new Share(this);\r\n pager = new Pager(this, Matter, Detail.sharePagerSize);\r\n user = Moon.getSingleton().user;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount(): void {\r\n this.share.uuid = this.props.match.params.uuid;\r\n //如果query中有rootUuid那么就更新.\r\n this.share.rootUuid = BrowserUtil.getQueryByName(\"shareRootUuid\") || this.share.rootUuid;\r\n\r\n this.pager.enableHistory();\r\n this.refresh();\r\n }\r\n\r\n componentWillReceiveProps(nextProps: Readonly, nextContext: any) {\r\n if (this.props.location.search !== nextProps.location.search) {\r\n this.refresh();\r\n }\r\n }\r\n\r\n refresh = () => {\r\n const puuid = BrowserUtil.getQueryByName(\"puuid\") || Matter.MATTER_ROOT;\r\n if (puuid === Matter.MATTER_ROOT) {\r\n this.share.rootUuid = Matter.MATTER_ROOT\r\n }\r\n\r\n this.share.httpBrowse(puuid, this.share.rootUuid, () => {\r\n if (puuid === Matter.MATTER_ROOT) {\r\n this.pager.clear();\r\n this.pager.totalItems = this.share.matters.length;\r\n this.pager.data = this.share.matters;\r\n }\r\n\r\n //刷新面包屑\r\n this.refreshBreadcrumbs();\r\n\r\n this.needShareCode = false;\r\n this.updateUI();\r\n });\r\n\r\n this.refreshMatterPager();\r\n };\r\n\r\n refreshMatterPager = () => {\r\n //只有当鉴权通过,并且不是分享根目录时需要才去进行page请求,根目录下matters已经通过browse接口拿到了\r\n const puuid = BrowserUtil.getQueryByName(\"puuid\");\r\n if (!this.needShareCode && puuid && puuid !== Matter.MATTER_ROOT) {\r\n const {\r\n uuid: shareUuid,\r\n code: shareCode,\r\n rootUuid: shareRootUuid,\r\n } = this.share;\r\n this.pager.setFilterValues({\r\n puuid,\r\n shareUuid,\r\n shareCode,\r\n shareRootUuid,\r\n orderCreateTime: SortDirection.DESC, // 默认以时间降序\r\n orderDir: SortDirection.DESC, // 默认文件夹排在前面\r\n });\r\n this.pager.httpList();\r\n }\r\n };\r\n\r\n getFiles = (value: string) => {\r\n this.share.code = value;\r\n this.refresh();\r\n };\r\n\r\n downloadZip = () => {\r\n const puuid = BrowserUtil.getQueryByName(\"puuid\") || Matter.MATTER_ROOT;\r\n this.share.downloadZip(puuid);\r\n };\r\n\r\n cancelShare = () => {\r\n Modal.confirm({\r\n title: Lang.t(\"share.cancelPrompt\"),\r\n icon: ,\r\n onOk: () => {\r\n this.share.httpDel(() => {\r\n MessageBoxUtil.success(Lang.t(\"operationSuccess\"));\r\n Sun.navigateTo(\"/share/list\");\r\n });\r\n },\r\n });\r\n };\r\n\r\n previewImage = (matter: Matter) => {\r\n let imageArray: string[] = [];\r\n let startIndex = -1;\r\n const {share} = this;\r\n this.pager.data.forEach((item) => {\r\n if (item.isImage()) {\r\n imageArray.push(item.getSharePreviewUrl(share.uuid!, share.code!, share.rootUuid));\r\n if (item.uuid === matter.uuid) {\r\n startIndex = imageArray.length - 1;\r\n }\r\n }\r\n });\r\n\r\n ImagePreviewer.showMultiPhoto(imageArray, startIndex);\r\n };\r\n\r\n goToDirectory = (matterUuid?: string) => {\r\n const paramId = this.props.match.params.uuid;\r\n\r\n if (matterUuid) {\r\n //share.rootUuid 一旦设置好了,只要根文件夹不换,那么就一直不会变。\r\n const puuid = BrowserUtil.getQueryByName(\"puuid\");\r\n if (!puuid || puuid === Matter.MATTER_ROOT) {\r\n this.share.rootUuid = matterUuid;\r\n this.pager.clear();\r\n }\r\n\r\n this.pager.setFilterValue(\"puuid\", matterUuid);\r\n this.pager.page = 0;\r\n const query = this.pager.getParams();\r\n Sun.navigateQueryTo({path: `/share/detail/${paramId}`, query});\r\n } else {\r\n // 回到分享根目录,先将rootUuid交给根目录\r\n this.share.rootUuid = Matter.MATTER_ROOT;\r\n this.pager.clear();\r\n Sun.navigateQueryTo({path: `/share/detail/${paramId}`});\r\n }\r\n };\r\n\r\n refreshBreadcrumbs = () => {\r\n let that = this;\r\n\r\n //清空\r\n that.breadcrumbModels = [];\r\n\r\n that.breadcrumbModels.push({\r\n name: Lang.t(\"layout.allFiles\"),\r\n path: \"/share/detail/\" + this.share.uuid,\r\n query: {},\r\n displayDirect: false,\r\n });\r\n\r\n let pMatter = this.share.dirMatter;\r\n while (pMatter && pMatter.uuid) {\r\n //插入到最前面\r\n let query = this.pager.getParams();\r\n query[\"puuid\"] = pMatter.uuid;\r\n that.breadcrumbModels.splice(1, 0, {\r\n name: pMatter.name,\r\n path: \"/share/detail/\" + this.share.uuid,\r\n query: query,\r\n displayDirect: false,\r\n });\r\n pMatter = pMatter.parent!;\r\n }\r\n };\r\n\r\n render() {\r\n const {share, needShareCode, user, pager} = this;\r\n\r\n if (share.detailLoading && needShareCode) return ;\r\n return (\r\n
\r\n \r\n {needShareCode ? (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n ) : (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {share.name}\r\n {share.hasExpired() ? (\r\n \r\n {Lang.t(\"share.expired\")}\r\n \r\n ) : null}\r\n \r\n
\r\n
\r\n \r\n \r\n {user.uuid && user.uuid === share.userUuid ? (\r\n <>\r\n \r\n ShareDialogModal.open(share)}\r\n >\r\n \r\n {Lang.t(\"share.getLink\")}\r\n \r\n \r\n ) : null}\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {Lang.t(\"share.sharer\")}: {share.username}\r\n \r\n \r\n {Lang.t(\"createTime\")}:{\" \"}\r\n {DateUtil.simpleDateHourMinute(share.createTime)}\r\n \r\n \r\n {share.expireInfinity\r\n ? Lang.t(\"share.noExpire\")\r\n : `${Lang.t(\r\n \"share.expireTime\"\r\n )}:${DateUtil.simpleDateHourMinute(share.expireTime)}`}\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n {pager.data.length ? (\r\n pager.data.map((matter) => (\r\n \r\n ))\r\n ) : (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport \"./BottomLayout.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport DefaultLogoPng from \"../../assets/image/logo.png\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\n\r\ninterface IProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class BottomLayout extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n static changeLang() {\r\n if (Lang.getSingleton().lang === \"zh\") {\r\n Lang.getSingleton().lang = \"en\";\r\n } else {\r\n Lang.getSingleton().lang = \"zh\";\r\n }\r\n localStorage.setItem(\"_lang\", Lang.getSingleton().lang);\r\n Sun.updateFrame();\r\n }\r\n\r\n render() {\r\n const { preference } = Moon.getSingleton();\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {Lang.getSingleton().lang === \"zh\" ? \"English\" : \"中文\"}\r\n \r\n \r\n {/*开源不易,请不要移除掉这里的代码,蓝眼云盘谢谢您! ^_^*/}\r\n {/*It is not easy to open source,please do not remove the following code, thank you! ^_^ */}\r\n \r\n Powered by \r\n \"logo\" {Lang.t(\"eyeblueTank\")}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n","import {ToolItem} from \"../types\";\r\nimport React from \"react\";\r\n\r\nexport default class MenuItem implements ToolItem {\r\n name: string;\r\n url: string;\r\n icon: React.ReactNode;\r\n active: boolean = false;\r\n\r\n\r\n constructor(name: string, url: string, icon: React.ReactNode) {\r\n this.name = name;\r\n this.url = url;\r\n this.icon = icon;\r\n\r\n //当前的url完全一致,那么就高亮显示\r\n if (url == \"/user/login\") {\r\n this.active = window.location.pathname === url || window.location.pathname === \"/user/register\"\r\n } else {\r\n this.active = window.location.pathname === url\r\n }\r\n\r\n }\r\n}\r\n","/**\r\n * 管理当前所有的菜单\r\n */\r\nimport React from \"react\";\r\nimport MenuItem from './MenuItem';\r\nimport Moon from '../model/global/Moon';\r\nimport User from '../model/user/User';\r\nimport {UserRole} from '../model/user/UserRole';\r\nimport Sun from '../../common/model/global/Sun';\r\nimport {\r\n AppstoreOutlined,\r\n DashboardOutlined,\r\n PoweroffOutlined,\r\n SettingOutlined,\r\n ShareAltOutlined,\r\n TeamOutlined,\r\n DeleteOutlined\r\n} from '@ant-design/icons';\r\nimport {LoginOutlined} from \"@ant-design/icons/lib\";\r\nimport Preference from \"../model/preference/Preference\";\r\nimport Lang from \"../model/global/Lang\";\r\n\r\n\r\nexport default class MenuManager {\r\n\r\n //单例模式\r\n private static singleton: MenuManager;\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n static getSingleton(): MenuManager {\r\n if (!MenuManager.singleton) {\r\n //初始化一个mainLand.\r\n MenuManager.singleton = new MenuManager();\r\n\r\n }\r\n return MenuManager.singleton;\r\n }\r\n\r\n /**\r\n * 获取到当前高亮的菜单\r\n */\r\n getSelectedKeys(): string[] {\r\n\r\n let keys: string[] = this.getMenuItems()\r\n .filter((menuItem: MenuItem, index: number) => {\r\n return menuItem.active;\r\n }).map((menuItem: MenuItem, index: number) => {\r\n return menuItem.url;\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n /**\r\n * 高亮某个菜单\r\n */\r\n selectMenu(url: string) {\r\n\r\n this.getMenuItems().forEach((menuItem: MenuItem, index: number) => {\r\n menuItem.active = menuItem.url === url;\r\n });\r\n\r\n }\r\n\r\n getMenuItems(): MenuItem[] {\r\n let user: User = Moon.getSingleton().user;\r\n let preference: Preference = Moon.getSingleton().preference;\r\n\r\n let menuItems: MenuItem[] = [];\r\n\r\n if (!preference.installed) {\r\n menuItems = [\r\n new MenuItem(Lang.t(\"layout.install\"), '/install/index', ),\r\n ];\r\n } else if (user.role === UserRole.GUEST) {\r\n menuItems = [\r\n new MenuItem(Lang.t(\"user.login\"), '/user/login', ),\r\n ];\r\n } else {\r\n menuItems.push(new MenuItem(Lang.t(\"layout.allFiles\"), '/matter/list', ))\r\n menuItems.push(new MenuItem(Lang.t(\"layout.myShare\"), '/share/list', ))\r\n menuItems.push(new MenuItem(Lang.t(\"layout.bin\"), '/bin/list', ))\r\n\r\n if (user.role === UserRole.ADMINISTRATOR) {\r\n menuItems.push(new MenuItem(Lang.t(\"layout.setting\"), '/preference/index', ))\r\n menuItems.push(new MenuItem(Lang.t(\"layout.dashboard\"), '/dashboard/index', ))\r\n menuItems.push(new MenuItem(Lang.t(\"layout.users\"), `${Sun.getSingleton().isMobile ? '/mobile': ''}/user/list`, ))\r\n }\r\n menuItems.push(new MenuItem(Lang.t(\"layout.logout\"), '/user/logout', ))\r\n\r\n\r\n }\r\n\r\n return menuItems;\r\n\r\n }\r\n\r\n}\r\n","import React from \"react\";\nimport {Modal} from \"antd\";\nimport TankComponent from \"../../../common/component/TankComponent\";\nimport Lang from \"../../../common/model/global/Lang\";\nimport BottomLayout from \"../BottomLayout\";\nimport DefaultLogoPng from \"../../../assets/image/logo.png\";\nimport \"./AboutModal.less\";\nimport Moon from \"../../../common/model/global/Moon\";\n\ninterface IProps {\n onSuccess: () => any,\n onClose: () => any\n}\n\ninterface IState {\n}\n\nexport default class AboutModal extends TankComponent {\n\n constructor(props: IProps) {\n super(props);\n }\n\n static open = () => {\n const modal = Modal.confirm({\n className: \"about-modal\",\n title: Lang.t(\"layout.about\"),\n width: \"90vw\",\n okCancel: false,\n okText: Lang.t(\"confirm\"),\n maskClosable: true,\n content: (\n {\n modal.destroy();\n }}\n onClose={() => {\n modal.destroy();\n }}\n />)\n })\n };\n\n changeLang = () => {\n BottomLayout.changeLang();\n this.updateUI();\n };\n\n render() {\n const {preference} = Moon.getSingleton();\n return (\n
\n \n \n \n \n \n \n

\n {Lang.getSingleton().lang === \"zh\" ? \"English\" : \"中文\"}\n

\n

\n Powered by \n \"logo\"\n {Lang.t(\"eyeblueTank\")}\n \n

\n
\n )\n }\n}\n","import React from \"react\";\r\nimport \"./SideLayout.less\";\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\nimport Preference from \"../../common/model/preference/Preference\";\r\nimport Moon from \"../../common/model/global/Moon\";\r\nimport DefaultLogoPng from \"../../assets/image/logo.png\";\r\nimport Sun from \"../../common/model/global/Sun\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { UserRole } from \"../../common/model/user/UserRole\";\r\nimport { Menu } from \"antd\";\r\nimport MenuItem from \"../../common/menu/MenuItem\";\r\nimport User from \"../../common/model/user/User\";\r\nimport MenuManager from \"../../common/menu/MenuManager\";\r\nimport { InfoCircleOutlined } from \"@ant-design/icons\";\r\nimport Lang from \"../../common/model/global/Lang\";\r\nimport AboutModal from \"./widget/AboutModal\";\r\n\r\ninterface IProps {}\r\n\r\ninterface IState {}\r\n\r\nexport default class SideLayout extends TankComponent {\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {}\r\n\r\n onSelect(param: any) {\r\n if (param.key === \"about\") {\r\n AboutModal.open();\r\n return;\r\n }\r\n\r\n let menuManager: MenuManager = MenuManager.getSingleton();\r\n menuManager.selectMenu(param.key);\r\n\r\n //打到对应的页面中。\r\n if (param.key == \"/user/logout\") {\r\n Sun.navigateTo(\"/user/login\");\r\n } else {\r\n Sun.navigateTo(param.key);\r\n }\r\n\r\n this.updateUI();\r\n }\r\n\r\n render() {\r\n const menuManager: MenuManager = MenuManager.getSingleton();\r\n const menuItems: MenuItem[] = menuManager.getMenuItems();\r\n const preference: Preference = Moon.getSingleton().preference;\r\n const user: User = Moon.getSingleton().user;\r\n\r\n return (\r\n \r\n {preference.installed ? (\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {user.role === UserRole.GUEST ? (\r\n \"未登录\"\r\n ) : (\r\n \r\n {user.username}\r\n \r\n )}\r\n
\r\n
\r\n ) : (\r\n
\r\n \"avatar\"\r\n
\r\n )}\r\n\r\n \r\n {menuItems.map((menuItem: MenuItem, index: number) => {\r\n if (\r\n menuItem.url === \"/bin/list\" &&\r\n !preference.getRecycleBinStatus()\r\n )\r\n return null;\r\n return (\r\n \r\n {menuItem.icon}\r\n {menuItem.name}\r\n \r\n );\r\n })}\r\n \r\n \r\n {Lang.t(\"layout.about\")}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\nimport \"./TopLayout.less\"\nimport TankComponent from \"../../common/component/TankComponent\";\nimport Preference from \"../../common/model/preference/Preference\";\nimport Moon from \"../../common/model/global/Moon\";\nimport DefaultLogoPng from '../../assets/image/logo.png';\nimport Sun from \"../../common/model/global/Sun\";\nimport {MenuFoldOutlined, MenuUnfoldOutlined} from \"@ant-design/icons/lib\";\nimport ImageUtil from \"../../common/util/ImageUtil\";\n\ninterface IProps {\n\n}\n\ninterface IState {\n\n}\n\n\nexport default class TopLayout extends TankComponent {\n\n constructor(props: IProps) {\n super(props)\n this.state = {}\n }\n\n componentDidMount() {\n\n }\n\n\n goHome() {\n\n Sun.navigateTo(\"/\")\n }\n\n //logo可以使用自定义的。\n logoUrl() {\n\n let preference: Preference = Moon.getSingleton().preference\n if (preference.logoUrl) {\n return ImageUtil.handleImageUrl(preference.logoUrl, false, 200, 200)\n\n } else {\n return DefaultLogoPng\n }\n }\n\n toggleDrawer() {\n Sun.getSingleton().showDrawer = !Sun.getSingleton().showDrawer\n Sun.updateFrame()\n }\n\n\n render() {\n\n let that = this\n\n let preference: Preference = Moon.getSingleton().preference\n return (\n\n
\n\n
\n \"logo\"/\n {preference.name}\n
\n\n
\n {\n Sun.getSingleton().showDrawer ? (\n\n \n ) : (\n \n )\n }\n
\n\n
\n\n )\n }\n}\n\n","import React from 'react';\r\nimport \"./ContentLayout.less\"\r\nimport TankComponent from \"../../common/component/TankComponent\";\r\n\r\ninterface IProps {\r\n\r\n}\r\n\r\ninterface IState {\r\n\r\n}\r\n\r\nexport default class ContentLayout extends TankComponent {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = {}\r\n }\r\n\r\n componentDidMount() {\r\n\r\n }\r\n\r\n render() {\r\n\r\n let that = this\r\n\r\n return (\r\n\r\n
\r\n {this.props.children}\r\n
\r\n\r\n )\r\n }\r\n}\r\n\r\n","import React from \"react\";\r\nimport {\r\n Redirect,\r\n Route,\r\n RouteComponentProps,\r\n withRouter,\r\n} from \"react-router-dom\";\r\n\r\nimport \"./Frame.less\";\r\nimport TankComponent from \"../common/component/TankComponent\";\r\nimport UserLogin from \"./user/Login\";\r\nimport UserRegister from \"./user/Register\";\r\n\r\nimport UserList from \"./user/List\";\r\nimport MobileUserList from \"./user/MobileList\";\r\nimport UserDetail from \"./user/Detail\";\r\nimport UserEdit from \"./user/Edit\";\r\nimport UserAuthentication from \"./user/Authentication\";\r\n\r\nimport PreferenceIndex from \"./preference/Index\";\r\nimport PreferenceEdit from \"./preference/Edit\";\r\nimport PreferenceEngineEdit from \"./preference/PreviewEngineEdit\";\r\nimport PreferenceScanEdit from \"./preference/ScanEdit\";\r\n\r\nimport DashboardIndex from \"./dashboard/Index\";\r\nimport InstallIndex from \"./install/Index\";\r\n\r\nimport MatterList from \"./matter/List\";\r\nimport MatterDetail from \"./matter/Detail\";\r\n\r\nimport BinList from \"./bin/List\";\r\n\r\nimport ShareList from \"./share/List\";\r\nimport ShareDetail from \"./share/Detail\";\r\nimport User from \"../common/model/user/User\";\r\nimport Moon from \"../common/model/global/Moon\";\r\nimport Sun from \"../common/model/global/Sun\";\r\nimport FrameLoading from \"./widget/FrameLoading\";\r\nimport Preference from \"../common/model/preference/Preference\";\r\nimport { WebResultCode } from \"../common/model/base/WebResultCode\";\r\nimport MessageBoxUtil from \"../common/util/MessageBoxUtil\";\r\nimport BottomLayout from \"./layout/BottomLayout\";\r\nimport SideLayout from \"./layout/SideLayout\";\r\nimport TopLayout from \"./layout/TopLayout\";\r\nimport ContentLayout from \"./layout/ContentLayout\";\r\n\r\ninterface IProps extends RouteComponentProps<{}> {}\r\n\r\ninterface IState {}\r\n\r\nclass RawFrame extends TankComponent {\r\n user: User = Moon.getSingleton().user;\r\n\r\n preference: Preference = Moon.getSingleton().preference;\r\n\r\n //是否已经完成初始化\r\n initialized: boolean = false;\r\n\r\n constructor(props: IProps) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n //装载全局的路由\r\n Sun.getSingleton().reactRouter = this.props.history;\r\n //装在全局Frame\r\n Sun.getSingleton().frameComponent = this;\r\n\r\n this.initialize();\r\n }\r\n\r\n //获取当前登录者的信息\r\n initialize() {\r\n let that = this;\r\n let pathname: string = that.props.location.pathname;\r\n\r\n this.preference.httpFetch(\r\n function () {\r\n // 白名单,不要求登录\r\n let whitePaths = [\r\n \"/user/login\",\r\n \"/user/register\",\r\n \"/user/authentication\",\r\n ];\r\n // 尝试登录名单,登录失败不做处理\r\n let tryLoginPaths = [\r\n \"/share/detail\",\r\n ];\r\n\r\n if(whitePaths.findIndex((path) => pathname.startsWith(path)) >= 0){\r\n that.initialized = true;\r\n that.updateUI();\r\n } else if(tryLoginPaths.findIndex((path) => pathname.startsWith(path)) >= 0) {\r\n that.user.httpInfo(false, function () {\r\n that.initialized = true;\r\n that.updateUI();\r\n });\r\n } else {\r\n that.user.httpInfo(true, function () {\r\n that.initialized = true;\r\n that.updateUI();\r\n });\r\n }\r\n },\r\n function (errMessage: string, response: any) {\r\n that.initialized = true;\r\n that.updateUI();\r\n if (\r\n response &&\r\n response.data &&\r\n response.data[\"code\"] === WebResultCode.NOT_INSTALLED\r\n ) {\r\n MessageBoxUtil.warning(\"网站尚未安装,即将引导进入安装页面!\");\r\n that.preference.installed = false;\r\n Sun.navigateTo(\"/install/index\");\r\n }\r\n }\r\n );\r\n }\r\n\r\n render() {\r\n let content: React.ReactNode;\r\n\r\n if (this.initialized) {\r\n content = (\r\n
\r\n \r\n\r\n \r\n\r\n \r\n {this.preference.installed ? (\r\n
\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n }\r\n />\r\n \r\n\r\n \r\n \r\n\r\n \r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n\r\n \r\n
\r\n );\r\n } else {\r\n content = ;\r\n }\r\n\r\n return
{content}
;\r\n }\r\n}\r\n\r\nconst Frame = withRouter>(RawFrame);\r\nexport default Frame;\r\n","import React from 'react';\r\nimport {BrowserRouter as Router} from \"react-router-dom\";\r\nimport {ConfigProvider} from 'antd';\r\nimport Frame from \"./pages/Frame\";\r\nimport en_US from 'antd/es/locale/en_US';\r\n\r\n// global less 须放在Frame组件之后,不然会出现按需加载的less文件覆盖样式问题\r\nimport './App.less';\r\n\r\nfunction App() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","// support IE >= 9\nimport 'react-app-polyfill/ie9';\nimport 'react-app-polyfill/stable';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(\n ,\n document.getElementById('root')\n);\n\n","module.exports = __webpack_public_path__ + \"static/media/archive.77d78eb7.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/empty.babf4d08.svg\";","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}