Browse Source

Merge pull request #51 from colinin/3.0

added file management module
pull/81/head
cKey 5 years ago
committed by GitHub
parent
commit
fe9f77528d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 46
      aspnet-core/LINGYUN.MicroService.sln
  2. 87
      aspnet-core/database/ApiGateway-Init.sql
  3. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountDomainModule.cs
  4. 16
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN.Abp.FileManagement.Application.Contracts.csproj
  5. 12
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/AbpFileManagementApplicationContractsModule.cs
  6. 21
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCopyOrMoveDto.cs
  7. 38
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCreateDto.cs
  8. 14
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileDeleteDto.cs
  9. 15
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemDownloadDto.cs
  10. 15
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemDto.cs
  11. 14
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemGetDto.cs
  12. 8
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemType.cs
  13. 11
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemUpdateDto.cs
  14. 11
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderCopyDto.cs
  15. 13
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderCreateDto.cs
  16. 11
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderMoveDto.cs
  17. 14
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/GetFileSystemListDto.cs
  18. 35
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/IFileSystemAppService.cs
  19. 34
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/Permissions/AbpFileManagementPermissionDefinitionProvider.cs
  20. 44
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/Permissions/AbpFileManagementPermissions.cs
  21. 13
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN.Abp.FileManagement.Application.csproj
  22. 12
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/AbpFileManagementApplicationModule.cs
  23. 15
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/FileManagementApplicationServiceBase.cs
  24. 439
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/FileSystemAppService.cs
  25. 22
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN.Abp.FileManagement.Domain.Shared.csproj
  26. 30
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/AbpFileManagementDomainSharedModule.cs
  27. 9
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/AbpFileManagementResource.cs
  28. 25
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/Resources/en.json
  29. 25
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/Resources/zh-Hans.json
  30. 18
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Settings/AbpFileManagementSettingNames.cs
  31. 16
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN.Abp.FileManagement.Domain.csproj
  32. 15
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/AbpFileManagementDomainModule.cs
  33. 9
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/FileSystemContainer.cs
  34. 44
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/Settings/AbpFileManagementSettingDefinitionProvider.cs
  35. 16
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN.Abp.FileManagement.HttpApi.csproj
  36. 21
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN/Abp/FileManagement/AbpFileManagementHttpApiModule.cs
  37. 259
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN/Abp/FileManagement/FileSystemController.cs
  38. 26
      aspnet-core/modules/platform/LINGYUN.Platform.Application.Contracts/LINGYUN/Platform/Permissions/PlatformPermissionDefinitionProvider.cs
  39. 2
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/AppPlatformDomainModule.cs
  40. 6
      aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application/LINGYUN/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs
  41. 12
      aspnet-core/services/admin/LINGYUN.BackendAdminApp.Host/BackendAdminHostModule.cs
  42. 1
      aspnet-core/services/admin/LINGYUN.BackendAdminApp.Host/LINGYUN.BackendAdminApp.Host.csproj
  43. 14
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/AppPlatformHttpApiHostModule.cs
  44. 2
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/LINGYUN.Platform.HttpApi.Host.csproj
  45. 5
      aspnet-core/tests/LINGYUN.Abp.BlobStoring.Aliyun.Tests/LINGYUN/Abp/BlobStoring/TestObjects/TestContainer1.cs
  46. 4
      vueJs/src/App.vue
  47. 1
      vueJs/src/api/clients.ts
  48. 116
      vueJs/src/api/filemanagement.ts
  49. 7
      vueJs/src/api/users.ts
  50. 33
      vueJs/src/components/LangSelect/index.vue
  51. 12
      vueJs/src/icons/components/admin.ts
  52. 12
      vueJs/src/icons/components/aggregate.ts
  53. 12
      vueJs/src/icons/components/api-gateway.ts
  54. 12
      vueJs/src/icons/components/api.ts
  55. 12
      vueJs/src/icons/components/client.ts
  56. 12
      vueJs/src/icons/components/file-manager.ts
  57. 12
      vueJs/src/icons/components/file-storage.ts
  58. 12
      vueJs/src/icons/components/file.ts
  59. 12
      vueJs/src/icons/components/folder.ts
  60. 12
      vueJs/src/icons/components/global-setting.ts
  61. 12
      vueJs/src/icons/components/group.ts
  62. 12
      vueJs/src/icons/components/identity-server.ts
  63. 12
      vueJs/src/icons/components/identity.ts
  64. 20
      vueJs/src/icons/components/index.ts
  65. 2
      vueJs/src/icons/components/manager.ts
  66. 12
      vueJs/src/icons/components/organization-unit.ts
  67. 2
      vueJs/src/icons/components/role.ts
  68. 12
      vueJs/src/icons/components/route.ts
  69. 12
      vueJs/src/icons/components/tenant.ts
  70. 1
      vueJs/src/icons/svg/admin.svg
  71. 1
      vueJs/src/icons/svg/aggregate.svg
  72. 1
      vueJs/src/icons/svg/api-gateway.svg
  73. 1
      vueJs/src/icons/svg/api.svg
  74. 1
      vueJs/src/icons/svg/client.svg
  75. 1
      vueJs/src/icons/svg/file-manager.svg
  76. 1
      vueJs/src/icons/svg/file-storage.svg
  77. 1
      vueJs/src/icons/svg/file.svg
  78. 1
      vueJs/src/icons/svg/folder.svg
  79. 1
      vueJs/src/icons/svg/global-setting.svg
  80. 1
      vueJs/src/icons/svg/group.svg
  81. 124
      vueJs/src/icons/svg/identity-server.svg
  82. 1
      vueJs/src/icons/svg/identity.svg
  83. 1
      vueJs/src/icons/svg/organization-unit.svg
  84. 1
      vueJs/src/icons/svg/route.svg
  85. 1
      vueJs/src/icons/svg/tenant.svg
  86. 22
      vueJs/src/lang/zh.ts
  87. 1
      vueJs/src/permission.ts
  88. 3
      vueJs/src/router/index.ts
  89. 6
      vueJs/src/router/modules/admin.ts
  90. 6
      vueJs/src/router/modules/apigateway.ts
  91. 27
      vueJs/src/router/modules/file-management.ts
  92. 8
      vueJs/src/router/modules/identityServer.ts
  93. 4
      vueJs/src/store/index.ts
  94. 27
      vueJs/src/store/modules/abp.ts
  95. 4
      vueJs/src/store/modules/permission.ts
  96. 13
      vueJs/src/store/modules/user.ts
  97. 39
      vueJs/src/utils/request.ts
  98. 4
      vueJs/src/views/admin/settings/components/SettingEditForm.vue
  99. 7
      vueJs/src/views/admin/settings/index.vue
  100. 437
      vueJs/src/views/file-management/index.vue

46
aspnet-core/LINGYUN.MicroService.sln

@ -185,13 +185,25 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFramework
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "file-management", "file-management", "{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.Application", "modules\file-management\LINGYUN.Abp.FileManagement.Application\LINGYUN.Abp.FileManagement.Application.csproj", "{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.FileManagement.Application.Contracts", "modules\file-management\LINGYUN.Abp.FileManagement.Application.Contracts\LINGYUN.Abp.FileManagement.Application.Contracts.csproj", "{86A67B8C-EFA0-4103-B60F-312F07C15A7A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.FileManagement.HttpApi", "modules\file-management\LINGYUN.Abp.FileManagement.HttpApi\LINGYUN.Abp.FileManagement.HttpApi.csproj", "{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.FileManagement.Domain.Shared", "modules\file-management\LINGYUN.Abp.FileManagement.Domain.Shared\LINGYUN.Abp.FileManagement.Domain.Shared.csproj", "{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.FileManagement.Domain", "modules\file-management\LINGYUN.Abp.FileManagement.Domain\LINGYUN.Abp.FileManagement.Domain.csproj", "{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -511,6 +523,26 @@ Global
{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU
{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.Build.0 = Release|Any CPU
{86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.Build.0 = Release|Any CPU
{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.Build.0 = Release|Any CPU
{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.Build.0 = Release|Any CPU
{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -608,6 +640,12 @@ Global
{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A} {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A}
{72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A} {72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A}
{7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A} {7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A}
{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} = {C5CAD011-DF84-4914-939C-0C029DCEF26F}
{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}
{86A67B8C-EFA0-4103-B60F-312F07C15A7A} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}
{854E1A42-FEA4-420E-9E83-0A39EE03F1ED} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}
{21FCEF89-9A3F-476E-833A-A9C2131B2AE6} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}
{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}

87
aspnet-core/database/ApiGateway-Init.sql

@ -11,7 +11,7 @@
Target Server Version : 80020 Target Server Version : 80020
File Encoding : 65001 File Encoding : 65001
Date: 07/08/2020 08:04:44 Date: 10/08/2020 09:45:50
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
@ -89,7 +89,7 @@ CREATE TABLE `appapigatewayauthoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayAuthOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayAuthOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayAuthOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayAuthOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 114 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayauthoptions -- Records of appapigatewayauthoptions
@ -174,6 +174,14 @@ INSERT INTO `appapigatewayauthoptions` VALUES (102, 1290849628051124224, '', '')
INSERT INTO `appapigatewayauthoptions` VALUES (103, 1290849798553776128, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (103, 1290849798553776128, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (104, 1290849978032238592, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (104, 1290849978032238592, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (105, 1291259822512693248, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (105, 1291259822512693248, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (106, 1292620505149145088, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (107, 1292620665505775616, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (108, 1292620843398791168, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (109, 1292621027574874112, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (110, 1292621363161137152, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (111, 1292621494837116928, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (112, 1292621629260365824, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (113, 1292622526073864192, '', '');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaybalanceroptions -- Table structure for appapigatewaybalanceroptions
@ -191,7 +199,7 @@ CREATE TABLE `appapigatewaybalanceroptions` (
UNIQUE INDEX `IX_AppApiGatewayBalancerOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayBalancerOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayGlobalConfiguratio~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayGlobalConfiguratio~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 117 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaybalanceroptions -- Records of appapigatewaybalanceroptions
@ -277,6 +285,14 @@ INSERT INTO `appapigatewaybalanceroptions` VALUES (105, NULL, 129084962805112422
INSERT INTO `appapigatewaybalanceroptions` VALUES (106, NULL, 1290849798553776128, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (106, NULL, 1290849798553776128, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (107, NULL, 1290849978032238592, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (107, NULL, 1290849978032238592, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (108, NULL, 1291259822512693248, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (108, NULL, 1291259822512693248, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (109, NULL, 1292620505149145088, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (110, NULL, 1292620665505775616, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (111, NULL, 1292620843398791168, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (112, NULL, 1292621027574874112, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (113, NULL, 1292621363161137152, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (114, NULL, 1292621494837116928, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (115, NULL, 1292621629260365824, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (116, NULL, 1292622526073864192, '', '', 0);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaycacheoptions -- Table structure for appapigatewaycacheoptions
@ -290,7 +306,7 @@ CREATE TABLE `appapigatewaycacheoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayCacheOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayCacheOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayCacheOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayCacheOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 114 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaycacheoptions -- Records of appapigatewaycacheoptions
@ -375,6 +391,14 @@ INSERT INTO `appapigatewaycacheoptions` VALUES (102, 1290849628051124224, 0, '')
INSERT INTO `appapigatewaycacheoptions` VALUES (103, 1290849798553776128, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (103, 1290849798553776128, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (104, 1290849978032238592, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (104, 1290849978032238592, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (105, 1291259822512693248, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (105, 1291259822512693248, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (106, 1292620505149145088, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (107, 1292620665505775616, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (108, 1292620843398791168, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (109, 1292621027574874112, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (110, 1292621363161137152, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (111, 1292621494837116928, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (112, 1292621629260365824, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (113, 1292622526073864192, 0, '');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaydiscovery -- Table structure for appapigatewaydiscovery
@ -484,7 +508,7 @@ CREATE TABLE `appapigatewayhttpoptions` (
UNIQUE INDEX `IX_AppApiGatewayHttpOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayHttpOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayGlobalConfiguration_It~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayGlobalConfiguration_It~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 117 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayhttpoptions -- Records of appapigatewayhttpoptions
@ -570,6 +594,14 @@ INSERT INTO `appapigatewayhttpoptions` VALUES (105, NULL, 1290849628051124224, 0
INSERT INTO `appapigatewayhttpoptions` VALUES (106, NULL, 1290849798553776128, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (106, NULL, 1290849798553776128, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (107, NULL, 1290849978032238592, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (107, NULL, 1290849978032238592, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (108, NULL, 1291259822512693248, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (108, NULL, 1291259822512693248, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (109, NULL, 1292620505149145088, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (110, NULL, 1292620665505775616, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (111, NULL, 1292620843398791168, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (112, NULL, 1292621027574874112, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (113, NULL, 1292621363161137152, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (114, NULL, 1292621494837116928, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (115, NULL, 1292621629260365824, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (116, NULL, 1292622526073864192, 0, 0, 0, 0, 0);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayqosoptions -- Table structure for appapigatewayqosoptions
@ -587,7 +619,7 @@ CREATE TABLE `appapigatewayqosoptions` (
UNIQUE INDEX `IX_AppApiGatewayQoSOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayQoSOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayGlobalConfiguration_Ite~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayGlobalConfiguration_Ite~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 117 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayqosoptions -- Records of appapigatewayqosoptions
@ -673,6 +705,14 @@ INSERT INTO `appapigatewayqosoptions` VALUES (105, NULL, 1290849628051124224, 50
INSERT INTO `appapigatewayqosoptions` VALUES (106, NULL, 1290849798553776128, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (106, NULL, 1290849798553776128, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (107, NULL, 1290849978032238592, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (107, NULL, 1290849978032238592, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (108, NULL, 1291259822512693248, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (108, NULL, 1291259822512693248, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (109, NULL, 1292620505149145088, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (110, NULL, 1292620665505775616, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (111, NULL, 1292620843398791168, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (112, NULL, 1292621027574874112, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (113, NULL, 1292621363161137152, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (114, NULL, 1292621494837116928, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (115, NULL, 1292621629260365824, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (116, NULL, 1292622526073864192, 50, 60000, 30000);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayratelimitoptions -- Table structure for appapigatewayratelimitoptions
@ -714,7 +754,7 @@ CREATE TABLE `appapigatewayratelimitrule` (
UNIQUE INDEX `IX_AppApiGatewayRateLimitRule_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayRateLimitRule_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayDynamicReRoute_Dynam~` FOREIGN KEY (`DynamicReRouteId`) REFERENCES `appapigatewaydynamicreroute` (`DynamicReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayDynamicReRoute_Dynam~` FOREIGN KEY (`DynamicReRouteId`) REFERENCES `appapigatewaydynamicreroute` (`DynamicReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 114 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayratelimitrule -- Records of appapigatewayratelimitrule
@ -799,6 +839,14 @@ INSERT INTO `appapigatewayratelimitrule` VALUES (102, 1290849628051124224, NULL,
INSERT INTO `appapigatewayratelimitrule` VALUES (103, 1290849798553776128, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (103, 1290849798553776128, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (104, 1290849978032238592, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (104, 1290849978032238592, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (105, 1291259822512693248, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (105, 1291259822512693248, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (106, 1292620505149145088, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (107, 1292620665505775616, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (108, 1292620843398791168, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (109, 1292621027574874112, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (110, 1292621363161137152, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (111, 1292621494837116928, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (112, 1292621629260365824, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (113, 1292622526073864192, NULL, '', 0, NULL, NULL, NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayreroute -- Table structure for appapigatewayreroute
@ -838,7 +886,7 @@ CREATE TABLE `appapigatewayreroute` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `AK_AppApiGatewayReRoute_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `AK_AppApiGatewayReRoute_ReRouteId`(`ReRouteId`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayReRoute_AppId_DownstreamPathTemplate_UpstreamPa~`(`AppId`, `DownstreamPathTemplate`, `UpstreamPathTemplate`) USING BTREE UNIQUE INDEX `IX_AppApiGatewayReRoute_AppId_DownstreamPathTemplate_UpstreamPa~`(`AppId`, `DownstreamPathTemplate`, `UpstreamPathTemplate`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 113 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 121 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayreroute -- Records of appapigatewayreroute
@ -923,6 +971,14 @@ INSERT INTO `appapigatewayreroute` VALUES (109, '{}', 'e937ff4ea11e4f0ca39d079c7
INSERT INTO `appapigatewayreroute` VALUES (110, '{}', '22212bc751b743678d9c2f095d05ce25', 1290849798553776128, '【平台服务】- 当前用户配置', '/api/settings/by-current-user', '', '', '/api/settings/by-current-user', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (110, '{}', '22212bc751b743678d9c2f095d05ce25', 1290849798553776128, '【平台服务】- 当前用户配置', '/api/settings/by-current-user', '', '', '/api/settings/by-current-user', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (111, '{}', '8dfa430d752a4b4a869ad401b3802a62', 1290849978032238592, '【平台服务】- 配置管理', '/api/settings', '', '', '/api/settings', 'GET,PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (111, '{}', '8dfa430d752a4b4a869ad401b3802a62', 1290849978032238592, '【平台服务】- 配置管理', '/api/settings', '', '', '/api/settings', 'GET,PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (112, '{}', '9844fed6507844f2ac64bd08649bd3a6', 1291259822512693248, '【身份认证服务】- 查询组织机构根节点', '/api/identity/organization-units/root-node', '', '', '/api/identity/organization-units/root-node', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (112, '{}', '9844fed6507844f2ac64bd08649bd3a6', 1291259822512693248, '【身份认证服务】- 查询组织机构根节点', '/api/identity/organization-units/root-node', '', '', '/api/identity/organization-units/root-node', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (113, '{}', '24d8794cf8f943b4ac45d2bcccf7c128', 1292620505149145088, '【平台服务】- 文件系统', '/api/file-management/file-system', '', '', '/api/file-management/file-system', 'GET,PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (114, '{}', '0acf6762d3af43efb655107e0039f5fc', 1292620665505775616, '【平台服务】- 文件系统 - 目录管理', '/api/file-management/file-system/folders', '', '', '/api/file-management/file-system/folders', 'POST,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (115, '{}', '5442138c816542bbb8b2c7fa51f10a5f', 1292620843398791168, '【平台服务】- 文件系统 - 文件管理', '/api/file-management/file-system/files', '', '', '/api/file-management/file-system/files', 'GET,POST,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (116, '{}', '7eb315567bbc470bbbfd26923c5d0aba', 1292621027574874112, '【平台服务】- 文件系统 - 复制目录', '/api/file-management/file-system/folders/copy', '', '', '/api/file-management/file-system/folders/copy', 'PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (117, '{}', 'af5853680cff454fa66ff6022f18da23', 1292621363161137152, '【平台服务】- 文件系统 - 移动目录', '/api/file-management/file-system/folders/move', '', '', '/api/file-management/file-system/folders/move', 'PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (118, '{}', '6daa6d8c8adb466899988fd8181c29a8', 1292621494837116928, '【平台服务】- 文件系统 - 复制文件', '/api/file-management/file-system/files/copy', '', '', '/api/file-management/file-system/files/copy', 'PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (119, '{}', '9560caaa3bd9424984c44724aa54bfe9', 1292621629260365824, '【平台服务】- 文件系统 - 移动文件', '/api/file-management/file-system/files/move', '', '', '/api/file-management/file-system/files/move', 'PUT,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (120, '{}', 'fc2aaa6035484201b9014912930fb7cb', 1292622526073864192, '【平台服务】- 文件系统 - 详情页', '/api/file-management/file-system/profile', '', '', '/api/file-management/file-system/profile', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayroutegroup -- Table structure for appapigatewayroutegroup
@ -966,7 +1022,7 @@ CREATE TABLE `appapigatewaysecurityoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewaySecurityOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewaySecurityOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewaySecurityOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewaySecurityOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 114 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaysecurityoptions -- Records of appapigatewaysecurityoptions
@ -1051,6 +1107,14 @@ INSERT INTO `appapigatewaysecurityoptions` VALUES (102, 1290849628051124224, '',
INSERT INTO `appapigatewaysecurityoptions` VALUES (103, 1290849798553776128, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (103, 1290849798553776128, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (104, 1290849978032238592, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (104, 1290849978032238592, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (105, 1291259822512693248, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (105, 1291259822512693248, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (106, 1292620505149145088, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (107, 1292620665505775616, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (108, 1292620843398791168, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (109, 1292621027574874112, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (110, 1292621363161137152, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (111, 1292621494837116928, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (112, 1292621629260365824, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (113, 1292622526073864192, '', '');
-- ---------------------------- -- ----------------------------
-- Table structure for cap.published -- Table structure for cap.published
@ -1069,11 +1133,6 @@ CREATE TABLE `cap.published` (
INDEX `IX_ExpiresAt`(`ExpiresAt`) USING BTREE INDEX `IX_ExpiresAt`(`ExpiresAt`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cap.published
-- ----------------------------
INSERT INTO `cap.published` VALUES (1291259823775178752, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-callback-name\":null,\"cap-msg-id\":\"1291259823775178752\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2020/8/6 14:28:27 +08:00\",\"cap-corr-id\":\"1291259823775178752\",\"cap-corr-seq\":\"0\"},\"Value\":{\"DateTime\":\"2020-08-06T14:28:27.0879956+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2020-08-06 14:28:27', '2020-08-07 14:28:27', 'Succeeded');
-- ---------------------------- -- ----------------------------
-- Table structure for cap.received -- Table structure for cap.received
-- ---------------------------- -- ----------------------------

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountDomainModule.cs

@ -1,4 +1,6 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Identity;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
@ -21,6 +23,11 @@ namespace LINGYUN.Abp.Account
.Get<Localization.AccountResource>() .Get<Localization.AccountResource>()
.AddVirtualJson("/LINGYUN/Abp/Account/Localization/Resources"); .AddVirtualJson("/LINGYUN/Abp/Account/Localization/Resources");
}); });
Configure<AbpDistributedEntityEventOptions>(options =>
{
options.AutoEventSelectors.AddNamespace("Volo.Abp.Identity");
});
} }
} }
} }

16
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN.Abp.FileManagement.Application.Contracts.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.FileManagement.Domain.Shared\LINGYUN.Abp.FileManagement.Domain.Shared.csproj" />
</ItemGroup>
</Project>

12
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/AbpFileManagementApplicationContractsModule.cs

@ -0,0 +1,12 @@
using Volo.Abp.Application;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileManagement
{
[DependsOn(
typeof(AbpFileManagementDomainSharedModule),
typeof(AbpDddApplicationModule))]
public class AbpFileManagementApplicationContractsModule : AbpModule
{
}
}

21
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCopyOrMoveDto.cs

@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FileCopyOrMoveDto
{
[StringLength(255)]
public string Path { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
[Required]
[StringLength(255)]
public string ToPath { get; set; }
[StringLength(255)]
public string ToName { get; set; }
}
}

38
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCreateDto.cs

@ -0,0 +1,38 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Auditing;
namespace LINGYUN.Abp.FileManagement
{
public class FileCreateDto
{
/// <summary>
/// 文件名
/// </summary>
[StringLength(255)]
public string Name { get; set; }
/// <summary>
/// 文件路径
/// </summary>
[StringLength(255)]
public string Path { get; set; }
/// <summary>
/// 文件数据,前端无需传递此参数,由控制器传递
/// </summary>
[DisableAuditing]
public byte[] Data { get; set; }
/// <summary>
/// 当前字节数
/// </summary>
[Required]
public int CurrentByte { get; set; }
/// <summary>
/// 最大字节数
/// </summary>
[Required]
public int TotalByte { get; set; }
/// <summary>
/// 是否覆盖文件
/// </summary>
public bool Rewrite { get; set; } = false;
}
}

14
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileDeleteDto.cs

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FileDeleteDto
{
[StringLength(255)]
public string Path { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
}
}

15
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemDownloadDto.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace LINGYUN.Abp.FileManagement
{
public class FileSystemDownloadDto : FileSystemGetDto
{
/// <summary>
/// 当前字节数
/// </summary>
public int CurrentByte { get; set; }
}
}

15
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemDto.cs

@ -0,0 +1,15 @@
using System;
namespace LINGYUN.Abp.FileManagement
{
public class FileSystemDto
{
public FileSystemType Type { get; set; }
public string Name { get; set; }
public string Parent { get; set; }
public string Extension { get; set; }
public long? Size { get; set; }
public DateTime CreationTime { get; set; }
public DateTime? LastModificationTime { get; set; }
}
}

14
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemGetDto.cs

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FileSystemGetDto
{
[StringLength(255)]
public string Path { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
}
}

8
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemType.cs

@ -0,0 +1,8 @@
namespace LINGYUN.Abp.FileManagement
{
public enum FileSystemType
{
Folder = 0,
File = 1
}
}

11
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemUpdateDto.cs

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FileSystemUpdateDto
{
[Required]
[StringLength(255)]
public string NewName { get; set; }
}
}

11
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderCopyDto.cs

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FolderCopyDto
{
[Required]
[StringLength(255)]
public string CopyToPath { get; set; }
}
}

13
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderCreateDto.cs

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FolderCreateDto
{
[Required]
[StringLength(255)]
public string Path { get; set; }
public string Parent { get; set; }
}
}

11
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FolderMoveDto.cs

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.FileManagement
{
public class FolderMoveDto
{
[Required]
[StringLength(255)]
public string MoveToPath { get; set; }
}
}

14
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/GetFileSystemListDto.cs

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.FileManagement
{
public class GetFileSystemListDto : PagedAndSortedResultRequestDto
{
// TODO: Windows最大路径长度,超过了貌似也无效了吧
[StringLength(255)]
public string Parent { get; set; }
public string Filter { get; set; }
}
}

35
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/IFileSystemAppService.cs

@ -0,0 +1,35 @@
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.FileManagement
{
public interface IFileSystemAppService : IApplicationService
{
Task<FileSystemDto> GetAsync(FileSystemGetDto input);
Task<PagedResultDto<FileSystemDto>> GetListAsync(GetFileSystemListDto input);
Task CreateFolderAsync(FolderCreateDto input);
Task<FileSystemDto> UpdateAsync([Required, StringLength(255)] string name, FileSystemUpdateDto input);
Task DeleteFolderAsync([Required, StringLength(255)] string path);
Task MoveFolderAsync([Required, StringLength(255)] string path, FolderMoveDto input);
Task CopyFolderAsync([Required, StringLength(255)] string path, FolderCopyDto input);
Task CreateFileAsync(FileCreateDto input);
Task DeleteFileAsync(FileDeleteDto input);
Task MoveFileAsync(FileCopyOrMoveDto input);
Task CopyFileAsync(FileCopyOrMoveDto input);
Task<Stream> DownloadFileAsync(FileSystemGetDto input);
}
}

34
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/Permissions/AbpFileManagementPermissionDefinitionProvider.cs

@ -0,0 +1,34 @@
using LINGYUN.Abp.FileManagement.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.FileManagement.Permissions
{
public class AbpFileManagementPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var fileManagement = context.AddGroup(AbpFileManagementPermissions.GroupName, L("Permission:FileManagement"));
var fileSystem = fileManagement.AddPermission(AbpFileManagementPermissions.FileSystem.Default, L("Permission:FileSystem"));
fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.Create, L("Permission:CreateFolder"));
fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.Delete, L("Permission:DeleteFolder"));
fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.Update, L("Permission:UpdateFolder"));
fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.Copy, L("Permission:CopyFolder"));
fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.Move, L("Permission:MoveFolder"));
var fileManager = fileSystem.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Default, L("Permission:FileManager"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Create, L("Permission:AppendFile"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Update, L("Permission:UpdateFile"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Delete, L("Permission:DeleteFile"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Copy, L("Permission:CopyFile"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Move, L("Permission:MoveFile"));
fileManager.AddChild(AbpFileManagementPermissions.FileSystem.FileManager.Download, L("Permission:DownloadFile"));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<AbpFileManagementResource>(name);
}
}
}

44
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/Permissions/AbpFileManagementPermissions.cs

@ -0,0 +1,44 @@
namespace LINGYUN.Abp.FileManagement.Permissions
{
public class AbpFileManagementPermissions
{
public const string GroupName = "AbpFileManagement";
/// <summary>
/// 文件系统
/// </summary>
public class FileSystem
{
public const string Default = GroupName + ".FileSystem";
public const string Create = Default + ".Create";
public const string Delete = Default + ".Delete";
public const string Update = Default + ".Update";
public const string Copy = Default + ".Copy";
public const string Move = Default + ".Move";
/// <summary>
/// 文件管理
/// </summary>
public class FileManager
{
public const string Default = FileSystem.Default + ".FileManager";
public const string Create = Default + ".Create";
public const string Copy = Default + ".Copy";
public const string Delete = Default + ".Delete";
public const string Update = Default + ".Update";
public const string Move = Default + ".Move";
public const string Download = Default + ".Download";
}
}
}
}

13
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN.Abp.FileManagement.Application.csproj

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.FileManagement.Application.Contracts\LINGYUN.Abp.FileManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.FileManagement.Domain\LINGYUN.Abp.FileManagement.Domain.csproj" />
</ItemGroup>
</Project>

12
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/AbpFileManagementApplicationModule.cs

@ -0,0 +1,12 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileManagement
{
[DependsOn(
typeof(AbpFileManagementDomainModule),
typeof(AbpFileManagementApplicationContractsModule))]
public class AbpFileManagementApplicationModule : AbpModule
{
}
}

15
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/FileManagementApplicationServiceBase.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.FileManagement
{
public class FileManagementApplicationServiceBase : ApplicationService
{
protected FileManagementApplicationServiceBase()
{
}
}
}

439
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/FileSystemAppService.cs

@ -0,0 +1,439 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.BlobStoring;
using Volo.Abp.BlobStoring.FileSystem;
namespace LINGYUN.Abp.FileManagement
{
public class FileSystemAppService : FileManagementApplicationServiceBase, IFileSystemAppService
{
protected IBlobContainer<FileSystemContainer> BlobContainer { get; }
protected IBlobContainerConfigurationProvider BlobContainerConfigurationProvider { get; }
public FileSystemAppService(
IBlobContainer<FileSystemContainer> blobContainer,
IBlobContainerConfigurationProvider blobContainerConfigurationProvider)
{
BlobContainer = blobContainer;
BlobContainerConfigurationProvider = blobContainerConfigurationProvider;
}
public virtual Task CopyFileAsync(FileCopyOrMoveDto input)
{
string fileSystemPath = GetFileSystemPath(input.Path);
var fileFullName = Path.Combine(fileSystemPath, input.Name);
if (!File.Exists(fileFullName))
{
throw new UserFriendlyException("指定的文件不存在!");
}
var copyToFilePath = GetFileSystemPath(input.ToPath);
var copyToFileFullName = Path.Combine(copyToFilePath, input.ToName ?? input.Name);
if (File.Exists(copyToFileFullName))
{
throw new UserFriendlyException("指定的路径中已经有相同的文件名存在!");
}
File.Copy(fileFullName, copyToFileFullName);
return Task.CompletedTask;
}
public virtual Task CopyFolderAsync([Required, StringLength(255)] string path, FolderCopyDto input)
{
string fileSystemPath = GetFileSystemPath(path);
if (!Directory.Exists(fileSystemPath))
{
throw new UserFriendlyException("指定目录不存在!");
}
var copyToFilePath = GetFileSystemPath(input.CopyToPath);
if (Directory.Exists(copyToFilePath))
{
throw new UserFriendlyException("指定的路径中已经有同名的目录存在!");
}
CopyDirectory(fileSystemPath, copyToFilePath);
return Task.CompletedTask;
}
public virtual async Task CreateFileAsync(FileCreateDto input)
{
string fileSystemPath = GetFileSystemPath(input.Path);
var fileFullName = Path.Combine(fileSystemPath, input.Name);
if (File.Exists(fileFullName) && !input.Rewrite)
{
throw new UserFriendlyException("指定的文件已经存在!");
}
await BlobContainer.SaveAsync(input.Name, input.Data, input.Rewrite);
}
public virtual Task CreateFolderAsync(FolderCreateDto input)
{
string fileSystemPath = GetFileSystemBashPath();
if (!input.Parent.IsNullOrWhiteSpace())
{
fileSystemPath = GetFileSystemPath(input.Parent);
}
var newFloderPath = Path.Combine(fileSystemPath, input.Path);
if (Directory.Exists(newFloderPath))
{
throw new UserFriendlyException("指定目录已经存在!");
}
Directory.CreateDirectory(newFloderPath);
return Task.CompletedTask;
}
public virtual Task DeleteFileAsync(FileDeleteDto input)
{
var fileSystemPath = GetFileSystemPath(input.Path);
fileSystemPath = Path.Combine(fileSystemPath, input.Name);
if (File.Exists(fileSystemPath))
{
File.Delete(fileSystemPath);
}
return Task.CompletedTask;
}
public virtual Task DeleteFolderAsync([Required, StringLength(255)] string path)
{
string fileSystemPath = GetFileSystemPath(path);
if (!Directory.Exists(fileSystemPath))
{
throw new UserFriendlyException("指定目录不存在!");
}
var fileSystemChildrenPath = Directory.GetDirectories(fileSystemPath);
if (fileSystemChildrenPath.Length > 0)
{
throw new UserFriendlyException("指定的目录不为空,不可删除此目录!");
}
var fileSystemPathFiles = Directory.GetFiles(fileSystemPath);
if (fileSystemPathFiles.Length > 0)
{
throw new UserFriendlyException("指定的目录不为空,不可删除此目录!");
}
Directory.Delete(fileSystemPath);
return Task.CompletedTask;
}
public virtual async Task<Stream> DownloadFileAsync(FileSystemGetDto input)
{
var fileSystemPath = GetFileSystemPath(input.Path);
fileSystemPath = Path.Combine(fileSystemPath, input.Name);
var blobName = GetFileSystemRelativePath(fileSystemPath);
// 去除第一个路径标识符
blobName = blobName.RemovePreFix("/", "\\");
return await BlobContainer.GetAsync(blobName);
}
public virtual Task<FileSystemDto> GetAsync(FileSystemGetDto input)
{
var fileSystemPath = GetFileSystemPath(input.Path);
fileSystemPath = Path.Combine(fileSystemPath, input.Name);
if (File.Exists(fileSystemPath))
{
var fileInfo = new FileInfo(fileSystemPath);
var fileSystem = new FileSystemDto
{
Type = FileSystemType.File,
Name = fileInfo.Name,
Size = fileInfo.Length,
Extension = fileInfo.Extension,
CreationTime = fileInfo.CreationTime,
LastModificationTime = fileInfo.LastWriteTime
};
if (fileInfo.Directory != null && !fileInfo.Directory.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(fileInfo.Directory.FullName);
}
return Task.FromResult(fileSystem);
}
if (Directory.Exists(fileSystemPath))
{
var directoryInfo = new DirectoryInfo(fileSystemPath);
var fileSystem = new FileSystemDto
{
Type = FileSystemType.Folder,
Name = directoryInfo.Name,
CreationTime = directoryInfo.CreationTime,
LastModificationTime = directoryInfo.LastWriteTime
};
if (directoryInfo.Parent != null && !directoryInfo.Parent.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(directoryInfo.Parent.FullName);
}
return Task.FromResult(fileSystem);
}
throw new UserFriendlyException("文件或目录不存在!");
}
public virtual Task<PagedResultDto<FileSystemDto>> GetListAsync(GetFileSystemListDto input)
{
List<FileSystemDto> fileSystems = new List<FileSystemDto>();
string fileSystemPath = GetFileSystemBashPath();
if (!input.Parent.IsNullOrWhiteSpace())
{
fileSystemPath = GetFileSystemPath(input.Parent);
}
var directoryInfo = new DirectoryInfo(fileSystemPath);
if (!directoryInfo.Exists)
{
return Task.FromResult(new PagedResultDto<FileSystemDto>(0, fileSystems));
}
// 查询全部文件系统
var fileSystemInfos = directoryInfo.GetFileSystemInfos();
// 指定搜索条件查询目录
FileSystemInfo[] fileSystemInfoSearchChildren;
if (!input.Filter.IsNullOrWhiteSpace())
{
var searchPattern = $"*{input.Filter}*";
fileSystemInfoSearchChildren = directoryInfo.GetFileSystemInfos(searchPattern);
}
else
{
fileSystemInfoSearchChildren = directoryInfo.GetFileSystemInfos();
}
fileSystemInfoSearchChildren = fileSystemInfoSearchChildren
.Skip((input.SkipCount - 1) * input.MaxResultCount)
.Take(input.MaxResultCount)
.ToArray();
foreach (var fileSystemInfo in fileSystemInfoSearchChildren)
{
var fileSystem = new FileSystemDto
{
Name = fileSystemInfo.Name,
CreationTime = fileSystemInfo.CreationTime,
LastModificationTime = fileSystemInfo.LastWriteTime,
};
if (fileSystemInfo is FileInfo fileInfo)
{
fileSystem.Type = FileSystemType.File;
fileSystem.Size = fileInfo.Length;
fileSystem.Extension = fileInfo.Extension;
if (fileInfo.Directory != null && !fileInfo.Directory.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(fileInfo.Directory.FullName);
}
}
else if (fileSystemInfo is DirectoryInfo directory)
{
fileSystem.Type = FileSystemType.Folder;
if (directory.Parent != null && !directory.Parent.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(directory.Parent.FullName);
}
}
fileSystems.Add(fileSystem);
}
fileSystems = fileSystems
.OrderBy(f => f.Type)
.ThenBy(f => f.Name)
.ToList();
return Task.FromResult(new PagedResultDto<FileSystemDto>(
fileSystemInfos.Length, fileSystems
));
}
public virtual Task MoveFileAsync(FileCopyOrMoveDto input)
{
string fileSystemPath = GetFileSystemPath(input.Path);
fileSystemPath = Path.Combine(fileSystemPath, input.Name);
if (!File.Exists(fileSystemPath))
{
throw new UserFriendlyException("指定目录不存在!");
}
var moveToFilePath = GetFileSystemPath(input.ToPath);
moveToFilePath = Path.Combine(moveToFilePath, input.ToName ?? input.Name);
if (Directory.Exists(moveToFilePath))
{
throw new UserFriendlyException("指定的路径中已经有同名的文件存在!");
}
File.Move(fileSystemPath, moveToFilePath);
return Task.CompletedTask;
}
public virtual Task MoveFolderAsync([Required, StringLength(255)] string path, FolderMoveDto input)
{
string fileSystemPath = GetFileSystemPath(path);
if (!Directory.Exists(fileSystemPath))
{
throw new UserFriendlyException("指定目录不存在!");
}
var moveToFilePath = GetFileSystemPath(input.MoveToPath);
if (Directory.Exists(moveToFilePath))
{
throw new UserFriendlyException("指定的路径中已经有同名的目录存在!");
}
Directory.Move(fileSystemPath, moveToFilePath);
return Task.CompletedTask;
}
public virtual Task<FileSystemDto> UpdateAsync([Required, StringLength(255)] string name, FileSystemUpdateDto input)
{
string fileSystemPath = GetFileSystemPath(name);
var renameFilePath = GetFileSystemPath(input.NewName);
if (File.Exists(fileSystemPath))
{
if (File.Exists(renameFilePath))
{
throw new UserFriendlyException("指定的文件名已经存在!");
}
File.Move(fileSystemPath, renameFilePath);
var fileInfo = new FileInfo(renameFilePath);
var fileSystem = new FileSystemDto
{
Type = FileSystemType.File,
Name = fileInfo.Name,
Size = fileInfo.Length,
Extension = fileInfo.Extension,
CreationTime = fileInfo.CreationTime,
LastModificationTime = fileInfo.LastWriteTime
};
if (fileInfo.Directory != null && !fileInfo.Directory.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(fileInfo.Directory.FullName);
}
return Task.FromResult(fileSystem);
}
if (Directory.Exists(fileSystemPath))
{
if (Directory.Exists(renameFilePath))
{
throw new UserFriendlyException("指定的路径中已经有同名的目录存在!");
}
Directory.Move(fileSystemPath, renameFilePath);
var directoryInfo = new DirectoryInfo(renameFilePath);
var fileSystem = new FileSystemDto
{
Type = FileSystemType.Folder,
Name = directoryInfo.Name,
CreationTime = directoryInfo.CreationTime,
LastModificationTime = directoryInfo.LastWriteTime
};
if (directoryInfo.Parent != null && !directoryInfo.Parent.FullName.IsNullOrWhiteSpace())
{
fileSystem.Parent = GetFileSystemRelativePath(directoryInfo.Parent.FullName);
}
return Task.FromResult(fileSystem);
}
throw new UserFriendlyException("文件或目录不存在!");
}
/// <summary>
/// 获取文件系统相对路径
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
protected virtual string GetFileSystemRelativePath(string path)
{
// 去除完整路径中的文件系统根目录
var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration();
var blobPath = fileSystemConfiguration.BasePath;
// 去除租户或宿主目录
if (CurrentTenant.Id == null)
{
blobPath = Path.Combine(blobPath, "host");
}
else
{
blobPath = Path.Combine(blobPath, "tenants", CurrentTenant.Id.Value.ToString("D"));
}
// 去除完整路径中的容器根目录
var containerName = BlobContainerNameAttribute.GetContainerName<FileSystemContainer>();
if (path.Contains(containerName))
{
blobPath = Path.Combine(blobPath, containerName);
}
path = path.Replace(blobPath, "");
return path;
}
protected virtual string GetFileSystemPath(string path)
{
var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration();
var blobPath = GetFileSystemBashPath();
if (!path.IsNullOrWhiteSpace() && fileSystemConfiguration.AppendContainerNameToBasePath)
{
// 去除第一个路径标识符
path = path.RemovePreFix("/", "\\");
blobPath = Path.Combine(blobPath, path);
}
return blobPath;
}
protected virtual string GetFileSystemBashPath()
{
var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration();
var blobPath = fileSystemConfiguration.BasePath;
blobPath = Path.Combine(Directory.GetCurrentDirectory(), blobPath);
if (CurrentTenant.Id == null)
{
blobPath = Path.Combine(blobPath, "host");
}
else
{
blobPath = Path.Combine(blobPath, "tenants", CurrentTenant.Id.Value.ToString("D"));
}
var containerName = BlobContainerNameAttribute.GetContainerName<FileSystemContainer>();
blobPath = Path.Combine(blobPath, containerName);
if (!Directory.Exists(blobPath))
{
Directory.CreateDirectory(blobPath);
}
return blobPath;
}
protected virtual FileSystemBlobProviderConfiguration GetFileSystemBlobProviderConfiguration()
{
var blobConfiguration = BlobContainerConfigurationProvider
.Get<FileSystemContainer>();
return blobConfiguration.GetFileSystemConfiguration();
}
protected void CopyDirectory(string sourcePath, string copyToPath)
{
var sourceDirectory = new DirectoryInfo(sourcePath);
var fileSystemInfos = sourceDirectory.GetFileSystemInfos();
foreach (var fileSystemInfo in fileSystemInfos)
{
var copyToFilePath = Path.Combine(copyToPath, fileSystemInfo.Name);
if (fileSystemInfo is DirectoryInfo)
{
if (!Directory.Exists(copyToFilePath))
{
Directory.CreateDirectory(copyToFilePath);
}
CopyDirectory(fileSystemInfo.FullName, copyToFilePath);
}
else
{
File.Copy(fileSystemInfo.FullName, copyToFilePath, true);
}
}
}
}
}

22
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN.Abp.FileManagement.Domain.Shared.csproj

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\FileManagement\Localization\Resources\en.json" />
<None Remove="LINGYUN\Abp\FileManagement\Localization\Resources\zh-Hans.json" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="LINGYUN\Abp\FileManagement\Localization\Resources\en.json" />
<EmbeddedResource Include="LINGYUN\Abp\FileManagement\Localization\Resources\zh-Hans.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Validation" Version="3.0.0" />
</ItemGroup>
</Project>

30
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/AbpFileManagementDomainSharedModule.cs

@ -0,0 +1,30 @@
using LINGYUN.Abp.FileManagement.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Validation;
using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.FileManagement
{
[DependsOn(typeof(AbpValidationModule))]
public class AbpFileManagementDomainSharedModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpFileManagementDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpFileManagementResource>("en")
.AddBaseTypes(
typeof(AbpValidationResource)
).AddVirtualJson("/LINGYUN/Abp/FileManagement/Localization/Resources");
});
}
}
}

9
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/AbpFileManagementResource.cs

@ -0,0 +1,9 @@
using Volo.Abp.Localization;
namespace LINGYUN.Abp.FileManagement.Localization
{
[LocalizationResourceName("AbpFileManagement")]
public class AbpFileManagementResource
{
}
}

25
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/Resources/en.json

@ -0,0 +1,25 @@
{
"culture": "en",
"texts": {
"Permission:FileManagement": "File management",
"Permission:FileSystem": "File system",
"Permission:FileManager": "Files",
"Permission:CreateFolder": "Create directory",
"Permission:DeleteFolder": "Delete directory",
"Permission:UpdateFolder": "Edit directory",
"Permission:MoveFolder": "Change directory",
"Permission:CopyFolder": "Copy directory",
"Permission:AppendFile": "Add files",
"Permission:UpdateFile": "Change file",
"Permission:DeleteFile": "Delete file",
"Permission:CopyFile": "Copy file",
"Permission:MoveFile": "Move file",
"Permission:DownloadFile": "Download file",
"UploadFileSizeBeyondLimit": "Upload file size cannot exceed {0} MB!",
"NotAllowedFileExtensionName": "Not allowed file extension: {0}!",
"DisplayName:FileLimitLength": "File limit size",
"Description:FileLimitLength": "Limit size of uploaded file in MB",
"DisplayName:AllowFileExtensions": "File extension",
"Description:AllowFileExtensions": "List of allowed extensions to upload files, with multiple extensions separated by, don't need a notation"
}
}

25
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Localization/Resources/zh-Hans.json

@ -0,0 +1,25 @@
{
"culture": "zh-Hans",
"texts": {
"Permission:FileManagement": "文件管理",
"Permission:FileSystem": "文件系统",
"Permission:FileManager": "文件",
"Permission:CreateFolder": "创建目录",
"Permission:DeleteFolder": "删除目录",
"Permission:UpdateFolder": "修改目录",
"Permission:MoveFolder": "变更目录",
"Permission:CopyFolder": "复制目录",
"Permission:AppendFile": "添加文件",
"Permission:UpdateFile": "变更文件",
"Permission:DeleteFile": "删除文件",
"Permission:CopyFile": "复制文件",
"Permission:MoveFile": "移动文件",
"Permission:DownloadFile": "下载文件",
"UploadFileSizeBeyondLimit": "上传文件大小不能超过 {0} MB!",
"NotAllowedFileExtensionName": "不被允许的文件扩展名: {0}!",
"DisplayName:FileLimitLength": "文件限制大小",
"Description:FileLimitLength": "上传文件的限制大小,单位(MB)",
"DisplayName:AllowFileExtensions": "文件扩展名",
"Description:AllowFileExtensions": "允许的上传文件扩展名列表,多个扩展名以,分隔,无需输入.符号"
}
}

18
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain.Shared/LINGYUN/Abp/FileManagement/Settings/AbpFileManagementSettingNames.cs

@ -0,0 +1,18 @@
namespace LINGYUN.Abp.FileManagement.Settings
{
public class AbpFileManagementSettingNames
{
public const string GroupName = "Abp.FileManagement";
/// <summary>
/// 文件限制长度
/// </summary>
public const string FileLimitLength = GroupName + ".FileLimitLength";
/// <summary>
/// 允许的文件扩展名类型
/// </summary>
public const string AllowFileExtensions = GroupName + ".AllowFileExtensions";
public const int DefaultFileLimitLength = 100;
public const string DefaultAllowFileExtensions = "dll,zip,rar,txt,log,xml,config,json,jpeg,jpg,png,bmp,ico,xlsx,xltx,xls,xlt,docs,dots,doc,dot,pptx,potx,ppt,pot,chm";
}
}

16
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN.Abp.FileManagement.Domain.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.BlobStoring.FileSystem" Version="3.0.0" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.FileManagement.Domain.Shared\LINGYUN.Abp.FileManagement.Domain.Shared.csproj" />
</ItemGroup>
</Project>

15
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/AbpFileManagementDomainModule.cs

@ -0,0 +1,15 @@
using Volo.Abp.Domain;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.FileManagement
{
[DependsOn(
typeof(AbpDddDomainModule),
typeof(AbpMultiTenancyModule),
typeof(AbpFileManagementDomainSharedModule)
)]
public class AbpFileManagementDomainModule : AbpModule
{
}
}

9
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/FileSystemContainer.cs

@ -0,0 +1,9 @@
using Volo.Abp.BlobStoring;
namespace LINGYUN.Abp.FileManagement
{
[BlobContainerName("abp-file-management")]
public class FileSystemContainer
{
}
}

44
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Domain/LINGYUN/Abp/FileManagement/Settings/AbpFileManagementSettingDefinitionProvider.cs

@ -0,0 +1,44 @@
using LINGYUN.Abp.FileManagement.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Settings;
namespace LINGYUN.Abp.FileManagement.Settings
{
public class AbpFileManagementSettingDefinitionProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
context.Add(CreateFileSystemSettings());
}
protected SettingDefinition[] CreateFileSystemSettings()
{
return new SettingDefinition[]
{
new SettingDefinition(
name: AbpFileManagementSettingNames.FileLimitLength,
defaultValue: AbpFileManagementSettingNames.DefaultFileLimitLength.ToString(),
displayName: L("DisplayName:FileLimitLength"),
description: L("Description:FileLimitLength"),
isVisibleToClients: true)
.WithProviders(
GlobalSettingValueProvider.ProviderName,
TenantSettingValueProvider.ProviderName),
new SettingDefinition(
name: AbpFileManagementSettingNames.AllowFileExtensions,
defaultValue: AbpFileManagementSettingNames.DefaultAllowFileExtensions,
displayName: L("DisplayName:AllowFileExtensions"),
description: L("Description:AllowFileExtensions"),
isVisibleToClients: true)
.WithProviders(
GlobalSettingValueProvider.ProviderName,
TenantSettingValueProvider.ProviderName),
};
}
protected LocalizableString L(string name)
{
return LocalizableString.Create<AbpFileManagementResource>(name);
}
}
}

16
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN.Abp.FileManagement.HttpApi.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.FileManagement.Application.Contracts\LINGYUN.Abp.FileManagement.Application.Contracts.csproj" />
</ItemGroup>
</Project>

21
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN/Abp/FileManagement/AbpFileManagementHttpApiModule.cs

@ -0,0 +1,21 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileManagement
{
[DependsOn(
typeof(AbpFileManagementApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule)
)]
public class AbpFileManagementHttpApiModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpFileManagementHttpApiModule).Assembly);
});
}
}
}

259
aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN/Abp/FileManagement/FileSystemController.cs

@ -0,0 +1,259 @@
using LINGYUN.Abp.FileManagement.Settings;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using System;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.IO;
using Volo.Abp.Settings;
namespace LINGYUN.Abp.FileManagement
{
[Controller]
[RemoteService(Name = "AbpFileManagement")]
[Area("file-management")]
[Route("api/file-management/file-system")]
public class FileSystemController : AbpController
{
protected ISettingProvider SettingProvider { get; }
protected IFileSystemAppService FileSystemAppService { get; }
public FileSystemController(
ISettingProvider settingProvider,
IFileSystemAppService fileSystemAppService)
{
SettingProvider = settingProvider;
FileSystemAppService = fileSystemAppService;
}
[HttpPut]
[Route("files/copy")]
public virtual async Task CopyFileAsync(FileCopyOrMoveDto input)
{
await FileSystemAppService.CopyFileAsync(input);
}
[HttpPut]
[Route("folders/copy")]
public virtual async Task CopyFolderAsync([Required, StringLength(255)] string path, FolderCopyDto input)
{
await FileSystemAppService.CopyFolderAsync(path, input);
}
[HttpPost]
[Route("files")]
public virtual async Task CreateFileAsync([FromQuery] FileCreateDto input, IFormFile file)
{
// 检查文件大小
var fileSizeLimited = await SettingProvider
.GetAsync(
AbpFileManagementSettingNames.FileLimitLength,
AbpFileManagementSettingNames.DefaultFileLimitLength);
if (fileSizeLimited * 1024 * 1024 < input.TotalByte)
{
throw new UserFriendlyException(L["UploadFileSizeBeyondLimit", fileSizeLimited]);
}
// 采用分块模式上传文件
// 保存分块到临时目录
var fileName = input.Name;
// 文件扩展名
var fileExtensionName = FileHelper.GetExtension(fileName);
var fileAllowExtension = await SettingProvider
.GetOrNullAsync(AbpFileManagementSettingNames.AllowFileExtensions);
if (fileAllowExtension.IsNullOrWhiteSpace())
{
fileAllowExtension = AbpFileManagementSettingNames.DefaultAllowFileExtensions;
}
// 检查文件扩展名
if (!fileAllowExtension.Split(',')
.Any(fe => fe.Equals(fileExtensionName, StringComparison.CurrentCultureIgnoreCase)))
{
throw new UserFriendlyException(L["NotAllowedFileExtensionName", fileExtensionName]);
}
// 以上传的文件名创建一个临时目录
var tempFilePath = Path.Combine(
Path.GetTempPath(),
"lingyun-abp-file-management",
"upload",
string.Concat(input.Path ?? "", input.Name).ToMd5());
DirectoryHelper.CreateIfNotExists(tempFilePath);
// 以上传的分片索引创建临时文件
var tempSavedFile = Path.Combine(tempFilePath, $"{input.CurrentByte}.{fileExtensionName}");
try
{
if (HttpContext.RequestAborted.IsCancellationRequested)
{
// 如果取消请求,删除临时目录
Directory.Delete(tempFilePath, true);
return;
}
// 保存临时文件
using (var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write))
{
// 写入当前分片文件
await file.CopyToAsync(fs);
}
if (input.CurrentByte == input.TotalByte)
{
// 合并文件
var mergeSavedFile = Path.Combine(tempFilePath, $"{fileName}");
// 获取并排序所有分片文件
var mergeFiles = Directory.GetFiles(tempFilePath).OrderBy(f => f.Length).ThenBy(f => f);
// 创建临时合并文件
using (var mergeSavedFileStream = new FileStream(mergeSavedFile, FileMode.Create))
{
foreach (var mergeFile in mergeFiles)
{
// 读取当前文件字节
var mergeFileBytes = await FileHelper.ReadAllBytesAsync(mergeFile);
// 写入到合并文件流
await mergeSavedFileStream.WriteAsync(mergeFileBytes, 0, mergeFileBytes.Length);
// 删除已参与合并的临时文件分片
FileHelper.DeleteIfExists(mergeFile);
}
// 读取文件数据
var fileData = await mergeSavedFileStream.GetAllBytesAsync();
input.Data = fileData;
}
await FileSystemAppService.CreateFileAsync(input);
// 文件保存之后删除临时文件目录
Directory.Delete(tempFilePath, true);
}
}
catch
{
// 发生异常删除临时文件目录
Directory.Delete(tempFilePath, true);
throw;
}
}
[HttpPost]
[Route("folders")]
public virtual async Task CreateFolderAsync(FolderCreateDto input)
{
await FileSystemAppService.CreateFolderAsync(input);
}
[HttpDelete]
[Route("files")]
public virtual async Task DeleteFileAsync(FileDeleteDto input)
{
await FileSystemAppService.DeleteFileAsync(input);
}
[HttpDelete]
[Route("folders")]
public virtual async Task DeleteFolderAsync([Required, StringLength(255)] string path)
{
await FileSystemAppService.DeleteFolderAsync(path);
}
[HttpGet]
[Route("files")]
public virtual async Task<IActionResult> DownloadFileAsync(FileSystemDownloadDto input)
{
var tempFileName = string.Concat(input.Path ?? "", input.Name);
tempFileName = tempFileName.ToMd5() + Path.GetExtension(input.Name);
// 以上传的文件名创建一个临时目录
var tempFilePath = Path.Combine(
Path.GetTempPath(),
"lingyun-abp-file-management",
"download");
DirectoryHelper.CreateIfNotExists(tempFilePath);
tempFilePath = Path.Combine(tempFilePath, tempFileName);
long contentLength = 0L;
// 单个分块大小 2MB
int bufferSize = 2 * 1024 * 1024;
using (new DisposeAction(() =>
{
// 最终下载完毕后,删除临时文件
if (bufferSize + input.CurrentByte > contentLength)
{
FileHelper.DeleteIfExists(tempFilePath);
}
}))
{
if (!System.IO.File.Exists(tempFilePath))
{
var blobStream = await FileSystemAppService.DownloadFileAsync(input);
using (var tempFileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
{
blobStream.Position = 0;
await blobStream.CopyToAsync(tempFileStream);
}
}
// 读取缓存文件
using var fileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read);
// 得到文件扩展名
var fileExt = Path.GetExtension(input.Name);
var provider = new FileExtensionContentTypeProvider();
// Http响应标头的文件类型
string memi = provider.Mappings[fileExt];
// 文件大小
contentLength = fileStream.Length;
if (bufferSize > contentLength)
{
var currentTransferBytes = await fileStream.GetAllBytesAsync();
// 写入响应流
return File(currentTransferBytes, memi, input.Name);
}
else
{
// 当前分页传输字节
byte[] currentTransferBytes = new byte[bufferSize];
if (input.CurrentByte + bufferSize >= contentLength)
{
currentTransferBytes = new byte[contentLength - input.CurrentByte];
}
// 读取文件流中的当前分块区段
fileStream.Seek(input.CurrentByte, SeekOrigin.Begin);
await fileStream.ReadAsync(currentTransferBytes, 0, currentTransferBytes.Length);
// 写入响应流
return File(currentTransferBytes, memi, input.Name);
}
}
}
[HttpGet]
[Route("profile")]
public virtual async Task<FileSystemDto> GetAsync(FileSystemGetDto input)
{
return await FileSystemAppService.GetAsync(input);
}
[HttpGet]
public virtual async Task<PagedResultDto<FileSystemDto>> GetListAsync(GetFileSystemListDto input)
{
return await FileSystemAppService.GetListAsync(input);
}
[HttpPut]
[Route("files/move")]
public virtual async Task MoveFileAsync(FileCopyOrMoveDto input)
{
await FileSystemAppService.MoveFileAsync(input);
}
[HttpPut]
[Route("folders/move")]
public virtual async Task MoveFolderAsync([Required, StringLength(255)] string path, FolderMoveDto input)
{
await FileSystemAppService.MoveFolderAsync(path, input);
}
[HttpPut]
public virtual async Task<FileSystemDto> UpdateAsync([Required, StringLength(255)] string name, FileSystemUpdateDto input)
{
return await FileSystemAppService.UpdateAsync(name, input);
}
}
}

26
aspnet-core/modules/platform/LINGYUN.Platform.Application.Contracts/LINGYUN/Platform/Permissions/PlatformPermissionDefinitionProvider.cs

@ -21,20 +21,20 @@ namespace LINGYUN.Platform.Permissions
// TODO: 2020-07-27 目前abp不支持对象存储管理(或者属于企业版?)需要创建一个 LINGYUN.Abp.BlobStoring 项目自行实现 // TODO: 2020-07-27 目前abp不支持对象存储管理(或者属于企业版?)需要创建一个 LINGYUN.Abp.BlobStoring 项目自行实现
var fileSystem = platform.AddPermission(PlatformPermissions.FileSystem.Default, L("Permission:FileSystem")); //var fileSystem = platform.AddPermission(PlatformPermissions.FileSystem.Default, L("Permission:FileSystem"));
fileSystem.AddChild(PlatformPermissions.FileSystem.Create, L("Permission:CreateFolder")); //fileSystem.AddChild(PlatformPermissions.FileSystem.Create, L("Permission:CreateFolder"));
fileSystem.AddChild(PlatformPermissions.FileSystem.Delete, L("Permission:DeleteFolder")); //fileSystem.AddChild(PlatformPermissions.FileSystem.Delete, L("Permission:DeleteFolder"));
fileSystem.AddChild(PlatformPermissions.FileSystem.Rename, L("Permission:RenameFolder")); //fileSystem.AddChild(PlatformPermissions.FileSystem.Rename, L("Permission:RenameFolder"));
fileSystem.AddChild(PlatformPermissions.FileSystem.Copy, L("Permission:CopyFolder")); //fileSystem.AddChild(PlatformPermissions.FileSystem.Copy, L("Permission:CopyFolder"));
fileSystem.AddChild(PlatformPermissions.FileSystem.Move, L("Permission:MoveFolder")); //fileSystem.AddChild(PlatformPermissions.FileSystem.Move, L("Permission:MoveFolder"));
var fileManager = fileSystem.AddChild(PlatformPermissions.FileSystem.FileManager.Default, L("Permission:FileManager")); //var fileManager = fileSystem.AddChild(PlatformPermissions.FileSystem.FileManager.Default, L("Permission:FileManager"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Create, L("Permission:AppendFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Create, L("Permission:AppendFile"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Update, L("Permission:UpdateFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Update, L("Permission:UpdateFile"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Delete, L("Permission:DeleteFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Delete, L("Permission:DeleteFile"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Copy, L("Permission:CopyFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Copy, L("Permission:CopyFile"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Move, L("Permission:MoveFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Move, L("Permission:MoveFile"));
fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Download, L("Permission:DownloadFile")); //fileManager.AddChild(PlatformPermissions.FileSystem.FileManager.Download, L("Permission:DownloadFile"));
} }
private static LocalizableString L(string name) private static LocalizableString L(string name)

2
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/AppPlatformDomainModule.cs

@ -41,6 +41,8 @@ namespace LINGYUN.Platform
options.EtoMappings.Add<RoleRoute, RoleRouteEto>(typeof(AppPlatformDomainModule)); options.EtoMappings.Add<RoleRoute, RoleRouteEto>(typeof(AppPlatformDomainModule));
options.EtoMappings.Add<AppVersion, AppVersionEto>(typeof(AppPlatformDomainModule)); options.EtoMappings.Add<AppVersion, AppVersionEto>(typeof(AppPlatformDomainModule));
options.AutoEventSelectors.Add<AppVersion>();
}); });
} }
public override void PostConfigureServices(ServiceConfigurationContext context) public override void PostConfigureServices(ServiceConfigurationContext context)

6
aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application/LINGYUN/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs

@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.TenantManagement; using Volo.Abp.TenantManagement;
@ -17,6 +18,11 @@ namespace LINGYUN.Abp.TenantManagement
{ {
options.AddProfile<AbpTenantManagementApplicationAutoMapperProfile>(validate: true); options.AddProfile<AbpTenantManagementApplicationAutoMapperProfile>(validate: true);
}); });
Configure<AbpDistributedEntityEventOptions>(options =>
{
options.AutoEventSelectors.Add<Tenant>();
});
} }
} }
} }

12
aspnet-core/services/admin/LINGYUN.BackendAdminApp.Host/BackendAdminHostModule.cs

@ -3,6 +3,7 @@ using IdentityModel;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.FileManagement;
using LINGYUN.Abp.Location.Tencent; using LINGYUN.Abp.Location.Tencent;
using LINGYUN.Abp.MessageService; using LINGYUN.Abp.MessageService;
using LINGYUN.Abp.SettingManagement; using LINGYUN.Abp.SettingManagement;
@ -59,6 +60,7 @@ namespace LINGYUN.BackendAdmin
typeof(AbpPermissionManagementDomainIdentityServerModule), typeof(AbpPermissionManagementDomainIdentityServerModule),
typeof(AppPlatformApplicationContractModule), typeof(AppPlatformApplicationContractModule),
typeof(ApiGatewayApplicationContractsModule), typeof(ApiGatewayApplicationContractsModule),
typeof(AbpFileManagementApplicationContractsModule),
typeof(AbpMessageServiceApplicationContractsModule), typeof(AbpMessageServiceApplicationContractsModule),
typeof(LINGYUN.Abp.Identity.AbpIdentityHttpApiModule), typeof(LINGYUN.Abp.Identity.AbpIdentityHttpApiModule),
typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationModule), typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationModule),
@ -196,6 +198,16 @@ namespace LINGYUN.BackendAdmin
options.Resources options.Resources
.Get<IdentityResource>() .Get<IdentityResource>()
.AddVirtualJson("/LINGYUN/BackendAdmin/Identity/Localization"); .AddVirtualJson("/LINGYUN/BackendAdmin/Identity/Localization");
options
.AddLanguagesMapOrUpdate(
"vue-admin-element-ui",
new NameValue("zh-Hans", "zh"),
new NameValue("en", "en"));
options
.AddLanguageFilesMapOrUpdate(
"vue-admin-element-ui",
new NameValue("zh-Hans", "zh"),
new NameValue("en", "en"));
}); });
context.Services.AddAuthentication("Bearer") context.Services.AddAuthentication("Bearer")

1
aspnet-core/services/admin/LINGYUN.BackendAdminApp.Host/LINGYUN.BackendAdminApp.Host.csproj

@ -62,6 +62,7 @@
<ProjectReference Include="..\..\..\modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj" /> <ProjectReference Include="..\..\..\modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\..\modules\file-management\LINGYUN.Abp.FileManagement.Application.Contracts\LINGYUN.Abp.FileManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj" />

14
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/AppPlatformHttpApiHostModule.cs

@ -3,6 +3,7 @@ using IdentityModel;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.FileManagement;
using LINGYUN.Abp.Notifications; using LINGYUN.Abp.Notifications;
using LINGYUN.Platform.EntityFrameworkCore; using LINGYUN.Platform.EntityFrameworkCore;
using LINGYUN.Platform.HttpApi; using LINGYUN.Platform.HttpApi;
@ -40,6 +41,8 @@ using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Platform namespace LINGYUN.Platform
{ {
[DependsOn( [DependsOn(
typeof(AbpFileManagementApplicationModule),
typeof(AbpFileManagementHttpApiModule),
typeof(AppPlatformApplicationModule), typeof(AppPlatformApplicationModule),
typeof(AppPlatformHttpApiModule), typeof(AppPlatformHttpApiModule),
typeof(AppPlatformEntityFrameworkCoreModule), typeof(AppPlatformEntityFrameworkCoreModule),
@ -162,6 +165,17 @@ namespace LINGYUN.Platform
{ {
options.Languages.Add(new LanguageInfo("en", "en", "English")); options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options
.AddLanguagesMapOrUpdate(
"vue-admin-element-ui",
new NameValue("zh-Hans", "zh"),
new NameValue("en", "en"));
options
.AddLanguageFilesMapOrUpdate(
"vue-admin-element-ui",
new NameValue("zh-Hans", "zh"),
new NameValue("en", "en"));
}); });
context.Services.AddAuthentication("Bearer") context.Services.AddAuthentication("Bearer")

2
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/LINGYUN.Platform.HttpApi.Host.csproj

@ -42,6 +42,8 @@
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj" />
<ProjectReference Include="..\..\..\modules\file-management\LINGYUN.Abp.FileManagement.Application\LINGYUN.Abp.FileManagement.Application.csproj" />
<ProjectReference Include="..\..\..\modules\file-management\LINGYUN.Abp.FileManagement.HttpApi\LINGYUN.Abp.FileManagement.HttpApi.csproj" />
<ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj" /> <ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj" />
<ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj" /> <ProjectReference Include="..\..\..\modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj" />

5
aspnet-core/tests/LINGYUN.Abp.BlobStoring.Aliyun.Tests/LINGYUN/Abp/BlobStoring/TestObjects/TestContainer1.cs

@ -1,5 +1,8 @@
namespace LINGYUN.Abp.BlobStoring.TestObjects using Volo.Abp.BlobStoring;
namespace LINGYUN.Abp.BlobStoring.TestObjects
{ {
[BlobContainerName("abp-blob-storing-test-container")]
public class TestContainer1 public class TestContainer1
{ {
} }

4
vueJs/src/App.vue

@ -6,7 +6,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
import { Component, Vue } from 'vue-property-decorator' import { Component, Vue } from 'vue-property-decorator'
import ServiceWorkerUpdatePopup from '@/pwa/components/ServiceWorkerUpdatePopup.vue' import ServiceWorkerUpdatePopup from '@/pwa/components/ServiceWorkerUpdatePopup.vue'
@ -22,7 +22,7 @@ export default class extends Vue {
} }
private async initializeAbpConfiguration() { private async initializeAbpConfiguration() {
await AbpConfigurationModule.GetAbpConfiguration() await AbpModule.GetAbpConfiguration()
} }
} }
</script> </script>

1
vueJs/src/api/clients.ts

@ -1,4 +1,3 @@
import ApiService from './serviceBase' import ApiService from './serviceBase'
import { pagerFormat } from '@/utils/index' import { pagerFormat } from '@/utils/index'
import { FullAuditedEntityDto, PagedAndSortedResultRequestDto, PagedResultDto } from './types' import { FullAuditedEntityDto, PagedAndSortedResultRequestDto, PagedResultDto } from './types'

116
vueJs/src/api/filemanagement.ts

@ -0,0 +1,116 @@
import ApiService from './serviceBase'
import { PagedAndSortedResultRequestDto, PagedResultDto } from './types'
const serviceUrl = process.env.VUE_APP_BASE_API
const baseUrl = '/api/file-management/file-system'
export const FileManagementUrl = serviceUrl + baseUrl
export default class FileManagementService {
public static getFileSystem(name: string, path: string | undefined) {
let _url = baseUrl + '?name=' + name
if (path) {
_url += '&path=' + path
}
return ApiService.Get<FileSystem>(_url, serviceUrl)
}
public static getFileSystemList(payload: FileSystemGetByPaged) {
let _url = baseUrl + '?skipCount=' + payload.skipCount
_url += '&maxResultCount=' + payload.maxResultCount
_url += '&sorting=' + payload.sorting
if (payload.filter) {
_url += '&filter=' + payload.filter
}
if (payload.parent) {
_url += '&parent=' + payload.parent
}
return ApiService.Get<PagedResultDto<FileSystem>>(_url, serviceUrl)
}
public static editFileSystem(name: string, newName: string) {
const _payload = { newName }
return ApiService.Put<FileSystem>(baseUrl, _payload, serviceUrl)
}
public static createFolder(path: string, parent: string | undefined) {
const _url = baseUrl + '/folders'
const _payload = {
path,
parent
}
return ApiService.Post<void>(_url, _payload, serviceUrl)
}
public static deleteFolder(path: string) {
const _url = baseUrl + '/folders?path=' + path
return ApiService.Delete(_url, serviceUrl)
}
public static moveFolder(path: string, toPath: string) {
const _url = baseUrl + '/folders/move?path=' + path
const _payload = { toPath }
return ApiService.Put<void>(_url, _payload, serviceUrl)
}
public static copyFolder(path: string, toPath: string) {
const _url = baseUrl + '/folders/copy?path=' + path
const _payload = { toPath }
return ApiService.Put<void>(_url, _payload, serviceUrl)
}
public static deleteFile(path: string, name: string) {
let _url = baseUrl + '/files?path=' + path
_url += '&name=' + name
return ApiService.Delete(_url, serviceUrl)
}
public static moveFile(payload: FileCopyOrMove) {
const _url = baseUrl + '/files/move'
return ApiService.Put<void>(_url, payload, serviceUrl)
}
public static copyFile(payload: FileCopyOrMove) {
const _url = baseUrl + '/files/copy'
return ApiService.Put<void>(_url, payload, serviceUrl)
}
public static downlodFle(name: string, path: string | undefined, currentByte: number | undefined) {
let _url = baseUrl + '/files?name=' + name
if (path) {
_url += '&path=' + path
}
_url += '&currentByte=' + currentByte
return ApiService.HttpRequestWithOriginResponse(({
url: _url,
method: 'GET',
responseType: 'blob'
}))
}
}
export enum FileSystemType {
Folder = 0,
File = 1
}
export class FileSystem {
type!: FileSystemType
name!: string
parent?: string
size?: number
extension?: string
creationTime!: Date
lastModificationTime?: Date
}
export class FileSystemGetByPaged extends PagedAndSortedResultRequestDto {
parent?: string
filter?: string
}
export class FileCopyOrMove {
path!: string
name!: string
toPath!: string
toName?: string
}

7
vueJs/src/api/users.ts

@ -158,11 +158,11 @@ export default class UserApiService {
}) })
} }
public static refreshToken(token: string) { public static refreshToken(token: string, refreshToken: string) {
const _url = '/connect/token' const _url = '/connect/token'
const refresh = { const refresh = {
grant_type: 'refresh_token', grant_type: 'refresh_token',
refresh_token: token, refresh_token: refreshToken,
client_id: process.env.VUE_APP_CLIENT_ID, client_id: process.env.VUE_APP_CLIENT_ID,
client_secret: process.env.VUE_APP_CLIENT_SECRET client_secret: process.env.VUE_APP_CLIENT_SECRET
} }
@ -172,7 +172,8 @@ export default class UserApiService {
method: 'POST', method: 'POST',
data: qs.stringify(refresh), data: qs.stringify(refresh),
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': token
} }
}) })
} }

33
vueJs/src/components/LangSelect/index.vue

@ -28,9 +28,9 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator' import { Component, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app' import { AppModule } from '@/store/modules/app'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
@Component({ @Component({
name: 'Login' name: 'Login'
@ -40,35 +40,10 @@ export default class extends Vue {
return AppModule.language return AppModule.language
} }
/** private async handleSetLanguage(lang: string) {
* 监听abp配置状态,增强本地化
*/
@Watch('$store.state.abpconfiguration.configuration')
private onAbpConfigurationChanged() {
const abpConfig = this.$store.state.abpconfiguration.configuration
if (abpConfig) {
const { twoLetterIsoLanguageName } = abpConfig.localization.currentCulture
const resources: { [key: string]: any} = {}
Object.keys(abpConfig.localization.values).forEach(key => {
const resource = abpConfig.localization.values[key]
if (typeof resource !== 'object') return
Object.keys(resource).forEach(key2 => {
if (/'{|{/g.test(resource[key2])) {
resource[key2] = resource[key2].replace(/'{|{/g, '{{').replace(/}'|}/g, '}}')
}
})
resources[key] = resource
})
this.$i18n.mergeLocaleMessage(twoLetterIsoLanguageName as string, resources)
console.log(this.$i18n)
}
}
private handleSetLanguage(lang: string) {
AppModule.SetLanguage(lang) AppModule.SetLanguage(lang)
this.$i18n.locale = lang this.$i18n.locale = lang
await AbpModule.GetAbpConfiguration()
this.$message({ this.$message({
message: 'Switch Language Success', message: 'Switch Language Success',
type: 'success' type: 'success'

12
vueJs/src/icons/components/admin.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'admin': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M136.533 0h204.8c75.094 0 136.534 61.44 136.534 136.533v204.8c0 75.094-61.44 136.534-136.534 136.534h-204.8C61.44 477.867 0 416.427 0 341.333v-204.8C0 61.44 61.44 0 136.533 0zm0 68.267c-40.96 0-68.266 27.306-68.266 68.266v204.8c0 40.96 27.306 68.267 68.266 68.267h204.8c40.96 0 68.267-27.307 68.267-68.267v-204.8c0-40.96-27.307-68.266-68.267-68.266h-204.8zm0 477.866h204.8c75.094 0 136.534 61.44 136.534 136.534v204.8c0 75.093-61.44 136.533-136.534 136.533h-204.8C61.44 1024 0 962.56 0 887.467v-204.8c0-75.094 61.44-136.534 136.533-136.534zm0 68.267c-40.96 0-68.266 27.307-68.266 68.267v204.8c0 40.96 27.306 68.266 68.266 68.266h204.8c40.96 0 68.267-27.306 68.267-68.266v-204.8c0-40.96-27.307-68.267-68.267-68.267h-204.8zM682.667 0h204.8C962.56 0 1024 61.44 1024 136.533v204.8c0 75.094-61.44 136.534-136.533 136.534h-204.8c-75.094 0-136.534-61.44-136.534-136.534v-204.8C546.133 61.44 607.573 0 682.667 0zm0 68.267c-40.96 0-68.267 27.306-68.267 68.266v204.8c0 40.96 27.307 68.267 68.267 68.267h204.8c40.96 0 68.266-27.307 68.266-68.267v-204.8c0-40.96-27.306-68.266-68.266-68.266h-204.8zm0 477.866h204.8c75.093 0 136.533 61.44 136.533 136.534v204.8C1024 962.56 962.56 1024 887.467 1024h-204.8c-75.094 0-136.534-61.44-136.534-136.533v-204.8c0-75.094 61.44-136.534 136.534-136.534zm0 68.267c-40.96 0-68.267 27.307-68.267 68.267v204.8c0 40.96 27.307 68.266 68.267 68.266h204.8c40.96 0 68.266-27.306 68.266-68.266v-204.8c0-40.96-27.306-68.267-68.266-68.267h-204.8z"/>'
}
})

12
vueJs/src/icons/components/aggregate.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'aggregate': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M533.333 725.333a64 64 0 11-64 64 64 64 0 0164-64m0-85.333a149.333 149.333 0 10149.334 149.333A149.333 149.333 0 00533.333 640zM426.667 277.333a106.667 106.667 0 10213.333 0 106.667 106.667 0 10-213.333 0zM170.66700000000003 320A106.667 106.667 0 10384 320a106.667 106.667 0 10-213.333 0zM682.6669999999999 320A106.667 106.667 0 10896 320a106.667 106.667 0 10-213.333 0z"/><path pid="1" _fill="#333" d="M512 341.333h42.667v384H512z"/><path pid="2" _fill="#333" d="M741.29 357.504l30.166 30.165-225.067 225.067-30.165-30.165z"/><path pid="3" _fill="#333" d="M558.08 582.016l-30.165 30.165L299.22 383.488l30.166-30.165z"/>'
}
})

12
vueJs/src/icons/components/api-gateway.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'api-gateway': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M523.776 430.592l-153.088 88.576 153.088 88.576 152.576-88.576-152.576-88.576zM357.888 539.136l.512 177.152L512 803.84l-1.024-176.64-153.088-88.064zm330.24 0l-153.6 87.552-1.024 176.64 153.6-87.552 1.024-176.64zM819.2 744.96L751.104 704l39.936-8.704-5.632-26.112-67.072 14.848-13.824 23.04L805.888 768l13.312-23.04zm-142.848 7.68l68.096 40.96-39.936 8.704 5.632 26.112 67.072-14.848 13.824-23.04L689.152 729.6l-12.8 23.04zM481.28 424.96h26.624V306.176H481.28v79.36l-27.648-29.696-19.456 18.432 47.104 50.688zm53.76-118.784V424.96h26.624v-79.872l27.648 29.696 19.456-18.432-47.104-50.176H535.04zm-190.464 401.92l-13.312-23.04-68.608 40.448 11.264-38.912-25.6-7.168-18.944 66.048 13.312 23.04 101.888-60.416zm-89.088 82.944l13.312 23.04 68.608-39.936-11.264 38.912 25.6 7.168 19.456-66.048-13.312-23.04-102.4 59.904zm622.08-45.056c-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432 45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432zm0 122.88c-22.528 0-40.448-17.92-40.448-40.448s17.92-40.448 40.448-40.448 40.448 17.92 40.448 40.448-17.92 40.448-40.448 40.448zm-355.84-576c45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432zm0-122.88c22.528 0 40.448 17.92 40.448 40.448s-17.92 40.448-40.448 40.448-40.448-17.92-40.448-40.448 18.432-40.448 40.448-40.448zM167.936 749.056c-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432 45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432zm0 122.88c-22.528 0-40.448-17.92-40.448-40.448s17.92-40.448 40.448-40.448 40.448 17.92 40.448 40.448-18.432 40.448-40.448 40.448z"/>'
}
})

12
vueJs/src/icons/components/api.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'api': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M740.8 500.8H262.4l158.4-158.4H512c8 28.8 35.2 49.6 65.6 49.6 38.4 0 70.4-32 70.4-70.4s-32-70.4-70.4-70.4c-32 0-57.6 20.8-65.6 49.6H404.8l-198.4 200h-49.6v40h148.8L488 723.2h88v49.6h139.2V633.6H576v49.6h-70.4L363.2 540.8h379.2V616l168-94.4-168-94.4v73.6zm-161.6-208c16 0 30.4 12.8 30.4 30.4S595.2 352 579.2 352s-30.4-12.8-30.4-30.4 14.4-28.8 30.4-28.8zM616 673.6h59.2v59.2H616v-59.2zm164.8-179.2l46.4 27.2-46.4 27.2v-54.4z"/>'
}
})

12
vueJs/src/icons/components/client.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'client': {
width: 128,
height: 107.44,
viewBox: '0 0 1220 1024',
data: '<path pid="0" _fill="#333" d="M823.532 1024H397.391a19.692 19.692 0 010-39.385h426.141a19.692 19.692 0 010 39.385zm298.93-118.154h-1024A98.462 98.462 0 010 807.385V98.462A98.462 98.462 0 0198.462 0h1024a98.462 98.462 0 0198.461 98.462v708.923a98.462 98.462 0 01-98.461 98.461zm-1024-866.461a59.077 59.077 0 00-59.077 59.077v708.923a59.077 59.077 0 0059.077 59.077h1024a59.077 59.077 0 0059.076-59.077V98.462a59.077 59.077 0 00-59.076-59.077z"/>'
}
})

12
vueJs/src/icons/components/file-manager.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'file-manager': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M958.976 977.408H70.656S0 988.16 0 893.952V131.584s1.536-84.992 88.064-84.992H399.36s37.888-7.68 69.12 40.96c29.696 47.104 47.104 76.8 47.104 76.8s10.752 12.8 36.352 12.8h400.896s70.656-7.68 70.656 70.656V898.56s10.752 78.848-64.512 78.848zm-66.048-597.504c0-18.944-15.872-34.816-34.816-34.816H166.4c-20.48 0-36.352 15.872-36.352 34.816v3.072c0 20.48 15.872 36.352 36.352 36.352h691.712c18.944 0 34.816-15.872 34.816-36.352z"/>'
}
})

12
vueJs/src/icons/components/file-storage.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'file-storage': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" d="M938.354 610.58H85.678V128.3H128.3V64.35h255.8l42.638 63.95h511.616z" _fill="#F6BB42"/><path pid="1" d="M980.978 674.53H43.04V192.25h42.638V128.3h255.798l42.624 63.95h596.878z" _fill="#FFCE54"/><path pid="2" d="M.4 277.496h1023.2V959.65H.4z" _fill="#656D78"/><path pid="3" d="M661.226 554.624c-23.514 0-42.624 19.14-42.624 42.624v21.326H405.428v-21.326c0-23.482-19.126-42.624-42.638-42.624-23.498 0-42.638 19.14-42.638 42.624v63.95c0 23.514 19.14 42.654 42.638 42.654h298.438c23.514 0 42.624-19.14 42.624-42.654v-63.95c-.002-23.484-19.112-42.624-42.626-42.624z" _fill="#F5F7FA"/>'
}
})

12
vueJs/src/icons/components/file.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'file': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" d="M853.333 960H170.667V64H640l213.333 213.333z" _fill="#90CAF9"/><path pid="1" d="M821.333 298.667H618.667V96z" _fill="#E1F5FE"/>'
}
})

12
vueJs/src/icons/components/folder.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'folder': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" d="M853.333 256h-384L384 170.667H170.667c-46.934 0-85.334 38.4-85.334 85.333v170.667h853.334v-85.334c0-46.933-38.4-85.333-85.334-85.333z" _fill="#FFA000"/><path pid="1" d="M853.333 256H170.667c-46.934 0-85.334 38.4-85.334 85.333V768c0 46.933 38.4 85.333 85.334 85.333h682.666c46.934 0 85.334-38.4 85.334-85.333V341.333c0-46.933-38.4-85.333-85.334-85.333z" _fill="#FFCA28"/>'
}
})

12
vueJs/src/icons/components/global-setting.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'global-setting': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M127.792 127.778h447.935v255.96h191.971v63.99h63.99v-127.98L575.727 63.788H127.792c-35.182 0-63.99 28.808-63.99 63.991v767.882c0 35.182 28.808 63.99 63.99 63.99h319.95v-63.99h-319.95V127.778zm515.925 67.99L769.01 321.06H643.717V195.768zm315.951 545.48V666.07l-66.113-13.374c-4.44-16.749-11.126-32.558-19.56-47.24l37.244-56.179-53.118-53.12-56.176 37.246c-14.685-8.44-30.434-15.123-47.244-19.562l-13.434-66.114h-75.116l-13.434 66.114c-16.81 4.44-32.558 11.122-47.305 19.562l-56.116-37.247-53.123 53.121 37.25 56.179c-8.5 14.682-15.186 30.491-19.621 47.24l-66.06 13.434v75.116l66.06 13.434c4.435 16.81 11.122 32.62 19.62 47.241l-37.249 56.179 53.123 53.118 56.116-37.245c14.746 8.5 30.496 15.186 47.305 19.56l13.434 66.114h75.116l13.434-66.113c16.81-4.375 32.559-11.062 47.244-19.56l56.176 37.244 53.118-53.118-37.245-56.179a190.766 190.766 0 0019.56-47.24l66.114-13.435zm-256.024 90.357c-70.673 0-127.917-57.24-127.917-127.979 0-70.676 57.243-127.98 127.917-127.98 70.74.064 128.044 57.367 128.044 127.98 0 70.74-57.304 127.98-128.044 127.98z"/>'
}
})

12
vueJs/src/icons/components/group.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'group': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M512 704.1c-4.7 0-9.4-1-13.8-3.1l-352-168.1c-11.2-5.4-18.3-16.7-18.2-29.2.1-12.4 7.4-23.7 18.8-28.8l88-40c16.1-7.3 35.1-.2 42.4 15.9 7.3 16.1.2 35.1-15.9 42.4l-25.5 11.6L512 636.6l276.2-131.9-21.1-9.6c-16.1-7.3-23.2-26.3-15.9-42.4 7.3-16.1 26.3-23.2 42.4-15.9l83.7 38c11.3 5.1 18.6 16.4 18.8 28.8.1 12.4-7 23.8-18.2 29.2l-352 168.1c-4.5 2.1-9.2 3.2-13.9 3.2zm0 192c-4.7 0-9.4-1-13.8-3.1l-352-168.1c-11.2-5.4-18.3-16.7-18.2-29.2.1-12.4 7.4-23.7 18.8-28.8l88-40c16.1-7.3 35.1-.2 42.4 15.9 7.3 16.1.2 35.1-15.9 42.4l-25.5 11.6L512 828.6l276.2-131.9-21.1-9.6c-16.1-7.3-23.2-26.3-15.9-42.4 7.3-16.1 26.3-23.2 42.4-15.9l83.7 38c11.3 5.1 18.6 16.4 18.8 28.8.1 12.4-7 23.8-18.2 29.2l-352 168.1c-4.5 2.1-9.2 3.2-13.9 3.2zm.1-381.1c-4.5 0-9.1-1-13.3-2.9l-8.6-3.9c-.1-.1-.2-.1-.3-.2L146.4 346.5c-11.3-5.3-18.5-16.8-18.4-29.3.1-12.5 7.5-23.8 18.9-28.9l352-157.5c8.3-3.7 17.8-3.7 26.1 0l352 157.5c11.4 5.1 18.8 16.4 18.9 28.9.1 12.5-7.1 23.9-18.4 29.3L534.2 508c-.1 0-.1.1-.2.1l-8.5 3.9c-4.3 2-8.8 3-13.4 3zm8.5-35.9zM236.7 318.3L512 447.7l275.3-129.5L512 195.1 236.7 318.3z"/>'
}
})

12
vueJs/src/icons/components/identity-server.ts

File diff suppressed because one or more lines are too long

12
vueJs/src/icons/components/identity.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'identity': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M824.32 874.24H223.36c-64 0-115.84-51.84-115.84-115.84V314.24c0-64 51.84-115.84 115.84-115.84h600.96c64 0 115.84 51.84 115.84 115.84V758.4c-.64 63.36-52.48 115.84-115.84 115.84zM223.36 262.4c-28.8 0-51.84 23.04-51.84 51.84V758.4c0 28.8 23.04 51.84 51.84 51.84h600.96c28.8 0 51.84-23.04 51.84-51.84V314.24c0-28.8-23.04-51.84-51.84-51.84H223.36z"/><path pid="1" _fill="#333" d="M416 593.28H307.84c-48 0-86.4-39.04-86.4-86.4v-108.8c0-48 39.04-86.4 86.4-86.4H416c48 0 86.4 39.04 86.4 86.4v108.16c0 48-38.4 87.04-86.4 87.04zm-108.16-217.6c-12.8 0-22.4 10.24-22.4 22.4v108.16c0 12.8 10.24 22.4 22.4 22.4H416c12.8 0 22.4-10.24 22.4-22.4V398.08c0-12.8-10.24-22.4-22.4-22.4H307.84zm465.28 122.88h-172.8c-17.92 0-32-14.08-32-32s14.08-32 32-32h172.16c17.92 0 32 14.08 32 32s-14.08 32-31.36 32zm20.48 238.72H259.2c-17.92 0-32-14.08-32-32s14.08-32 32-32h534.4c17.92 0 32 14.08 32 32s-14.72 32-32 32z"/>'
}
})

20
vueJs/src/icons/components/index.ts

@ -1,8 +1,13 @@
/* tslint:disable */ /* tslint:disable */
import './404' import './404'
import './admin'
import './aggregate'
import './api-gateway'
import './api'
import './back-top' import './back-top'
import './bug' import './bug'
import './chart' import './chart'
import './client'
import './clipboard' import './clipboard'
import './component' import './component'
import './dashboard' import './dashboard'
@ -16,26 +21,38 @@ import './excel'
import './exit-fullscreen' import './exit-fullscreen'
import './eye-off' import './eye-off'
import './eye-on' import './eye-on'
import './file-manager'
import './file-storage'
import './file'
import './folder'
import './form' import './form'
import './fullscreen' import './fullscreen'
import './global-setting'
import './group'
import './guide-2' import './guide-2'
import './guide' import './guide'
import './hamburger' import './hamburger'
import './icon' import './icon'
import './identity-server'
import './identity'
import './international' import './international'
import './language' import './language'
import './like' import './like'
import './link' import './link'
import './list' import './list'
import './lock' import './lock'
import './manager'
import './message' import './message'
import './money' import './money'
import './nested' import './nested'
import './organization-unit'
import './password' import './password'
import './pdf' import './pdf'
import './people' import './people'
import './peoples' import './peoples'
import './qq' import './qq'
import './role'
import './route'
import './search' import './search'
import './shopping' import './shopping'
import './size' import './size'
@ -43,11 +60,10 @@ import './skill'
import './star' import './star'
import './tab' import './tab'
import './table' import './table'
import './tenant'
import './theme' import './theme'
import './tree-table' import './tree-table'
import './tree' import './tree'
import './user' import './user'
import './wechat' import './wechat'
import './zip' import './zip'
import './manager'
import './role'

2
vueJs/src/icons/components/manager.ts

@ -7,6 +7,6 @@ icon.register({
width: 128, width: 128,
height: 128, height: 128,
viewBox: '0 0 1024 1024', viewBox: '0 0 1024 1024',
data: '<path pid="0" d="M874.026 855.181L654.784 599.01c16.283-10.382 31.553-22.614 45.538-36.599 50.302-50.304 78.005-117.185 78.005-188.324 0-71.138-27.703-138.018-78.006-188.321-50.302-50.302-117.182-78.005-188.318-78.005-71.139 0-138.021 27.703-188.323 78.005-50.304 50.303-78.007 117.183-78.007 188.321 0 71.139 27.703 138.021 78.007 188.324 15.065 15.065 31.626 28.086 49.334 38.961L150.291 854.815a37.002 37.002 0 0 0 27.793 61.424h667.832a37 37 0 0 0 28.11-61.058zM549 732.37c0 20.435-16.565 37-37 37s-37-16.565-37-37v-99.304h74v99.304z" />' data: '<path pid="0" _fill="#333" d="M874.026 855.181L654.784 599.01c16.283-10.382 31.553-22.614 45.538-36.599 50.302-50.304 78.005-117.185 78.005-188.324 0-71.138-27.703-138.018-78.006-188.321-50.302-50.302-117.182-78.005-188.318-78.005-71.139 0-138.021 27.703-188.323 78.005-50.304 50.303-78.007 117.183-78.007 188.321 0 71.139 27.703 138.021 78.007 188.324 15.065 15.065 31.626 28.086 49.334 38.961L150.291 854.815a37.002 37.002 0 0027.793 61.424h667.832a37 37 0 0028.11-61.058zM549 732.37c0 20.435-16.565 37-37 37s-37-16.565-37-37v-99.304h74v99.304z"/>'
} }
}) })

12
vueJs/src/icons/components/organization-unit.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'organization-unit': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M642.465 52.212c6.51 0 19.532 6.51 19.532 19.563V241.4c0 6.543-6.479 19.564-19.532 19.564H388.013c-6.51-6.51-13.053-13.053-13.053-26.074V65.265c0-6.575 6.543-19.564 19.596-19.564h247.91v6.51zm0-52.212H388.013c-39.159 0-65.232 32.584-65.232 65.265v169.592c0 32.584 26.073 65.264 65.232 65.264h254.452c39.127 0 65.201-32.68 65.201-65.264V65.265C707.666 32.616 681.56 0 642.466 0M224.93 815.44v163.178H61.818V815.441H224.93zm19.596-52.18H48.765c-19.563 0-32.584 12.99-32.584 32.585v195.762c0 19.595 13.052 32.648 32.584 32.648h195.73c19.563 0 32.584-13.053 32.584-32.648V795.845c.032-19.595-19.563-32.584-32.552-32.584m345.663 52.18v163.177H427.14V815.441h163.05zm13.117-52.18h-195.73c-19.564 0-32.585 12.989-32.585 32.584v195.762c0 19.595 13.053 32.648 32.585 32.648h195.73c19.563 0 32.584-13.053 32.584-32.648V795.845c.032-19.595-12.989-32.584-32.584-32.584m358.811 52.18v163.177H799.037V815.441h163.081zm13.085-52.18H779.41c-19.563 0-32.552 12.989-32.552 32.584v195.762c0 19.595 12.957 32.648 32.552 32.648h195.794c19.532 0 32.585-13.053 32.585-32.648V795.845c0-19.595-13.053-32.584-32.585-32.584M505.426 345.823c-13.053 0-19.532 6.446-19.532 19.563v326.163c0 12.99 6.479 19.532 19.532 19.532s19.563-6.542 19.563-19.532V365.386c6.543-13.117-6.51-19.563-19.563-19.563m352.3 110.838H140.168c-13.085 0-19.595 13.02-19.595 19.563 0 6.606 6.51 26.17 19.595 26.17h717.56c13.02 0 19.531-13.053 19.531-19.564 0-6.606-6.51-26.17-19.531-26.17zm-717.559 0c-13.085 0-19.595 13.02-19.595 19.563v182.741c0 13.053 13.053 19.532 19.595 19.532 6.479 0 19.564-13.053 19.564-19.532V482.83c-.032-13.148-6.575-26.17-19.564-26.17zm717.56 0c-13.053 0-19.564 13.02-19.564 19.563v182.741c0 13.053 13.053 19.532 19.564 19.532s19.531-13.053 19.531-19.532V482.83c0-13.148-6.51-26.17-19.531-26.17z"/>'
}
})

2
vueJs/src/icons/components/role.ts

@ -7,6 +7,6 @@ icon.register({
width: 128, width: 128,
height: 128, height: 128,
viewBox: '0 0 1024 1024', viewBox: '0 0 1024 1024',
data: '<path pid="0" d="M960 832v42.667h-46.933c-4.267 12.8-8.534 25.6-17.067 38.4l34.133 34.133-29.866 29.867-34.134-34.134c-12.8 8.534-21.333 12.8-34.133 12.8v46.934h-42.667v-46.934c-12.8-4.266-25.6-8.533-38.4-17.066L716.8 972.8l-29.867-29.867 34.134-34.133c-8.534-12.8-12.8-25.6-12.8-38.4h-46.934v-42.667h46.934c4.266-12.8 8.533-25.6 17.066-38.4L691.2 755.2l29.867-29.867 34.133 34.134c12.8-8.534 21.333-12.8 38.4-17.067v-46.933h42.667V742.4c12.8 4.267 25.6 8.533 38.4 17.067l29.866-29.867 29.867 29.867-34.133 34.133c8.533 12.8 12.8 25.6 12.8 38.4H960z m-89.6-8.533L840.533 793.6c-4.266 0-8.533-4.267-8.533-4.267v4.267h-42.667v-4.267c-4.266 0-8.533 4.267-12.8 4.267l-29.866 29.867c0 4.266-4.267 8.533-4.267 12.8h4.267v42.666c0 4.267 4.266 8.534 4.266 8.534l29.867 29.866c4.267 0 4.267 4.267 8.533 4.267H832c4.267 0 8.533-4.267 8.533-4.267l29.867-29.866c0-4.267 4.267-4.267 4.267-8.534v-42.666c0-8.534 0-12.8-4.267-12.8z m-187.733-192l64 21.333c-128 76.8-128 157.867-128 264.533H64V806.4c0-89.6 72.533-110.933 72.533-110.933l200.534-64 64-34.134V524.8s-51.2-21.333-51.2-81.067h-8.534c-34.133-8.533-64-59.733-68.266-98.133 0-38.4 29.866-38.4 29.866-38.4l25.6 8.533s-12.8-34.133-12.8-128c0-42.666 12.8-64 38.4-81.066 0 0-38.4-81.067 157.867-85.334 187.733 0 187.733 157.867 187.733 157.867v55.467l-4.266 72.533h29.866c21.334 0 21.334 42.667 21.334 42.667s-25.6 89.6-64 93.866h-8.534c-8.533 46.934-55.466 81.067-55.466 81.067v72.533l64 34.134z" />' data: '<path pid="0" _fill="#333" d="M960 832v42.667h-46.933c-4.267 12.8-8.534 25.6-17.067 38.4l34.133 34.133-29.866 29.867-34.134-34.134c-12.8 8.534-21.333 12.8-34.133 12.8v46.934h-42.667v-46.934c-12.8-4.266-25.6-8.533-38.4-17.066L716.8 972.8l-29.867-29.867 34.134-34.133c-8.534-12.8-12.8-25.6-12.8-38.4h-46.934v-42.667h46.934c4.266-12.8 8.533-25.6 17.066-38.4L691.2 755.2l29.867-29.867 34.133 34.134c12.8-8.534 21.333-12.8 38.4-17.067v-46.933h42.667V742.4c12.8 4.267 25.6 8.533 38.4 17.067l29.866-29.867 29.867 29.867-34.133 34.133c8.533 12.8 12.8 25.6 12.8 38.4H960zm-89.6-8.533L840.533 793.6c-4.266 0-8.533-4.267-8.533-4.267v4.267h-42.667v-4.267c-4.266 0-8.533 4.267-12.8 4.267l-29.866 29.867c0 4.266-4.267 8.533-4.267 12.8h4.267v42.666c0 4.267 4.266 8.534 4.266 8.534l29.867 29.866c4.267 0 4.267 4.267 8.533 4.267H832c4.267 0 8.533-4.267 8.533-4.267l29.867-29.866c0-4.267 4.267-4.267 4.267-8.534v-42.666c0-8.534 0-12.8-4.267-12.8zm-187.733-192l64 21.333c-128 76.8-128 157.867-128 264.533H64V806.4c0-89.6 72.533-110.933 72.533-110.933l200.534-64 64-34.134V524.8s-51.2-21.333-51.2-81.067h-8.534c-34.133-8.533-64-59.733-68.266-98.133 0-38.4 29.866-38.4 29.866-38.4l25.6 8.533s-12.8-34.133-12.8-128c0-42.666 12.8-64 38.4-81.066 0 0-38.4-81.067 157.867-85.334 187.733 0 187.733 157.867 187.733 157.867v55.467l-4.266 72.533h29.866c21.334 0 21.334 42.667 21.334 42.667s-25.6 89.6-64 93.866h-8.534c-8.533 46.934-55.466 81.067-55.466 81.067v72.533l64 34.134z"/>'
} }
}) })

12
vueJs/src/icons/components/route.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'route': {
width: 128,
height: 120.47,
viewBox: '0 0 1088 1024',
data: '<path pid="0" _fill="#333" d="M896 576H608v384a64 64 0 01-64 64H384a64 64 0 01-64-64V576H64a64 64 0 01-64-64V192a64 64 0 0164-64h256V64a64 64 0 0164-64h160a64 64 0 0164 64v64h288l192 192v64zM384 960h160V576H384v384zM544 64H384v64h160V64zm320 128H64v320h800l160-160z"/>'
}
})

12
vueJs/src/icons/components/tenant.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'tenant': {
width: 128,
height: 117.34,
viewBox: '0 0 1117 1024',
data: '<path pid="0" _fill="#333" d="M897.536 979.55h-18.432c-25.786 0-49.431-17.549-58.694-42.264-4.189-1.955-9.402-4.096-13.405-6.098a73.542 73.542 0 01-25.88 5.027c-16.662.233-32.628-6.516-44.124-18.525l-13.498-13.312a63.86 63.86 0 01-13.312-70.05c-2.095-4.19-4.143-8.146-6.238-13.266-25.832-9.31-44.264-33.047-44.264-58.834V742.68c0-25.74 18.432-49.431 43.24-58.694l6.144-12.427s0-.931 1.118-.931a69.818 69.818 0 01-5.12-25.833c0-16.43 6.19-32.907 18.478-44.265l13.498-13.498c11.544-11.869 27.462-18.525 44.079-18.432 9.309 0 17.687 2.141 25.88 5.167 4.049-2.095 9.262-4.143 12.334-5.167a63.209 63.209 0 0158.693-41.146h18.526c25.786 0 49.43 17.455 58.74 42.263 4.096 1.955 9.216 4.096 13.265 6.144 8.1-3.723 16.99-5.492 25.926-5.027 16.43 0 32.861 6.051 44.125 18.386l13.498 13.405c18.246 18.432 23.506 46.08 13.312 69.911 2.142 4.143 4.19 8.378 6.191 13.498 24.576 9.123 40.96 32.443 41.193 58.648v18.525c0 26.81-17.455 49.431-42.264 58.74-2.001 4.19-4.096 9.31-6.237 13.405 3.259 8.239 5.26 16.43 5.26 25.786 0 16.431-6.237 32.955-18.525 44.265l-12.428 12.381a61.454 61.454 0 01-44.125 18.525c-9.402 0-17.547-2.048-25.926-5.073-4.142 2.048-8.145 4.142-13.265 6.097a61.905 61.905 0 01-57.716 42.217m-83.038-96.023c1.77 0 4.655.93 6.517 1.769l5.632 2.792c5.539 2.886 11.17 5.586 15.825 7.54 4.655 1.77 8.425 5.586 9.356 10.194a29.556 29.556 0 0027.927 24.204h16.85a29.556 29.556 0 0027.927-24.204 14.662 14.662 0 019.309-10.24c6.563-1.862 13.964-5.585 21.41-9.356a15.267 15.267 0 0114.058.931c9.309 6.517 26.065 5.632 35.42-4.654l12.103-12.195a28.44 28.44 0 008.47-20.434 33.187 33.187 0 00-4.654-15.965c-2.792-3.584-2.792-9.17-.977-13.87l1.862-2.746c2.792-6.563 6.516-13.126 8.378-18.712a14.895 14.895 0 0110.24-9.309 29.79 29.79 0 0023.273-27.927v-17.687a29.65 29.65 0 00-23.273-28.02 14.522 14.522 0 01-10.24-9.403c-2.793-7.447-5.586-14.894-9.31-21.364a14.895 14.895 0 01.932-14.057 29.556 29.556 0 00-3.77-36.305l-13.033-12.102c-9.402-9.402-25.135-11.171-35.375-3.724a15.127 15.127 0 01-14.103.838 94.301 94.301 0 00-21.411-9.31 14.988 14.988 0 01-9.31-10.24 29.696 29.696 0 00-27.926-23.272h-16.85a29.556 29.556 0 00-27.927 23.273 14.708 14.708 0 01-9.31 10.24c-6.516 1.862-13.078 4.654-21.503 9.309a14.801 14.801 0 01-13.964-.884c-10.24-7.448-26.065-5.632-36.352 3.723l-12.195 12.195a28.858 28.858 0 00-3.677 36.306c2.793 3.863 2.793 9.448.931 14.01-1.862 2.84-2.793 5.678-4.608 8.425a58.175 58.175 0 00-6.516 12.94 15.034 15.034 0 01-10.287 9.401c-12.148 2.7-25.134 13.964-25.134 27.974v16.757c0 13.963 12.986 25.18 25.134 27.927 4.655.93 8.378 4.654 10.333 9.402 1.769 5.539 4.515 11.264 7.448 16.756l2.7 4.562a15.174 15.174 0 01-.932 14.103 28.719 28.719 0 004.562 36.352l12.148 12.102c9.775 9.542 24.855 11.078 36.399 3.724a18.804 18.804 0 017.493-1.77m71.68-52.084a77.545 77.545 0 01-77.824-77.963c0-43.24 34.444-77.87 77.824-77.87 43.38 0 77.871 34.583 77.871 77.87 0 42.542-35.375 77.963-77.87 77.963zm0-123.67a45.056 45.056 0 00-44.87 44.916c0 24.715 20.201 44.962 44.87 44.962 24.716 0 44.963-20.247 44.963-44.962a45.103 45.103 0 00-44.963-44.917zM517.12 500.875a246.086 246.086 0 01-245.9-245.807A246.086 246.086 0 01517.073 9.263a246.132 246.132 0 01245.9 245.806 246.225 246.225 0 01-245.9 245.807zm0-432.082a186.415 186.415 0 00-186.275 186.182A186.415 186.415 0 00517.12 441.251a186.415 186.415 0 00186.228-186.228A186.415 186.415 0 00517.167 68.794zM62.045 988.393c-.652-9.449-14.801-232.681 125.021-382.744 80.198-86.016 193.63-129.675 337.455-129.675 226.024 0 275.549 93.742 280.39 104.355l-54.226 24.762c-.046 0-39.377-69.446-226.21-69.446-126.325 0-225.095 37.143-293.516 110.313C108.823 776.75 121.39 982.156 121.437 984.204l-59.392 4.189zm5.586-293.935H8.052c0-86.342 105.565-189.812 194.095-261.446 1.862-1.443.698-4.747-.466-6.423-130.7-190.836 26.066-366.173 27.742-367.942l43.985 40.169c-5.167 5.772-126.278 142.708-22.528 294.12 19.41 28.533 14.522 65.63-11.31 86.482C133.538 565.155 67.63 647.54 67.63 694.458z"/>'
}
})

1
vueJs/src/icons/svg/admin.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M136.533333 0h204.8c75.093333 0 136.533333 61.44 136.533334 136.533333v204.8c0 75.093333-61.44 136.533333-136.533334 136.533334H136.533333C61.44 477.866667 0 416.426667 0 341.333333V136.533333C0 61.44 61.44 0 136.533333 0z m0 68.266667c-40.96 0-68.266667 27.306667-68.266666 68.266666v204.8c0 40.96 27.306667 68.266667 68.266666 68.266667h204.8c40.96 0 68.266667-27.306667 68.266667-68.266667V136.533333c0-40.96-27.306667-68.266667-68.266667-68.266666H136.533333zM136.533333 546.133333h204.8c75.093333 0 136.533333 61.44 136.533334 136.533334v204.8c0 75.093333-61.44 136.533333-136.533334 136.533333H136.533333c-75.093333 0-136.533333-61.44-136.533333-136.533333v-204.8c0-75.093333 61.44-136.533333 136.533333-136.533334z m0 68.266667c-40.96 0-68.266667 27.306667-68.266666 68.266667v204.8c0 40.96 27.306667 68.266667 68.266666 68.266666h204.8c40.96 0 68.266667-27.306667 68.266667-68.266666v-204.8c0-40.96-27.306667-68.266667-68.266667-68.266667H136.533333zM682.666667 0h204.8c75.093333 0 136.533333 61.44 136.533333 136.533333v204.8c0 75.093333-61.44 136.533333-136.533333 136.533334h-204.8c-75.093333 0-136.533333-61.44-136.533334-136.533334V136.533333c0-75.093333 61.44-136.533333 136.533334-136.533333z m0 68.266667c-40.96 0-68.266667 27.306667-68.266667 68.266666v204.8c0 40.96 27.306667 68.266667 68.266667 68.266667h204.8c40.96 0 68.266667-27.306667 68.266666-68.266667V136.533333c0-40.96-27.306667-68.266667-68.266666-68.266666h-204.8zM682.666667 546.133333h204.8c75.093333 0 136.533333 61.44 136.533333 136.533334v204.8c0 75.093333-61.44 136.533333-136.533333 136.533333h-204.8c-75.093333 0-136.533333-61.44-136.533334-136.533333v-204.8c0-75.093333 61.44-136.533333 136.533334-136.533334z m0 68.266667c-40.96 0-68.266667 27.306667-68.266667 68.266667v204.8c0 40.96 27.306667 68.266667 68.266667 68.266666h204.8c40.96 0 68.266667-27.306667 68.266666-68.266666v-204.8c0-40.96-27.306667-68.266667-68.266666-68.266667h-204.8z" /></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

1
vueJs/src/icons/svg/aggregate.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M533.333333 725.333333a64 64 0 1 1-64 64 64 64 0 0 1 64-64m0-85.333333a149.333333 149.333333 0 1 0 149.333334 149.333333 149.333333 149.333333 0 0 0-149.333334-149.333333z" /><path fill="#333333" d="M533.333333 277.333333m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z" /><path fill="#333333" d="M277.333333 320m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z" /><path fill="#333333" d="M789.333333 320m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z" /><path fill="#333333" d="M512 341.333333h42.666667v384h-42.666667z" /><path fill="#333333" d="M741.290667 357.504l30.165333 30.165333-225.066667 225.066667-30.165333-30.165333z" /><path fill="#333333" d="M558.08 582.016l-30.165333 30.165333-228.693334-228.693333 30.165334-30.165333z" /></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
vueJs/src/icons/svg/api-gateway.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M523.776 430.592l-153.088 88.576 153.088 88.576 152.576-88.576-152.576-88.576z m-165.888 108.544l0.512 177.152 153.6 87.552-1.024-176.64-153.088-88.064z m330.24 0l-153.6 87.552-1.024 176.64 153.6-87.552 1.024-176.64z m131.072 205.824l-68.096-40.96 39.936-8.704-5.632-26.112-67.072 14.848-13.824 23.04 101.376 60.928 13.312-23.04z m-142.848 7.68l68.096 40.96-39.936 8.704 5.632 26.112 67.072-14.848 13.824-23.04-101.888-60.928-12.8 23.04zM481.28 424.96h26.624V306.176H481.28v79.36l-27.648-29.696-19.456 18.432L481.28 424.96z m53.76-118.784V424.96h26.624V345.088l27.648 29.696 19.456-18.432-47.104-50.176h-26.624z m-190.464 401.92l-13.312-23.04-68.608 40.448 11.264-38.912-25.6-7.168-18.944 66.048 13.312 23.04 101.888-60.416z m-89.088 82.944l13.312 23.04 68.608-39.936-11.264 38.912 25.6 7.168 19.456-66.048-13.312-23.04-102.4 59.904z m622.08-45.056c-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432 45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432z m0 122.88c-22.528 0-40.448-17.92-40.448-40.448s17.92-40.448 40.448-40.448 40.448 17.92 40.448 40.448-17.92 40.448-40.448 40.448zM521.728 292.864c45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432z m0-122.88c22.528 0 40.448 17.92 40.448 40.448s-17.92 40.448-40.448 40.448-40.448-17.92-40.448-40.448 18.432-40.448 40.448-40.448zM167.936 749.056c-45.568 0-82.432 36.864-82.432 82.432 0 45.568 36.864 82.432 82.432 82.432 45.568 0 82.432-36.864 82.432-82.432 0-45.568-36.864-82.432-82.432-82.432z m0 122.88c-22.528 0-40.448-17.92-40.448-40.448s17.92-40.448 40.448-40.448 40.448 17.92 40.448 40.448-18.432 40.448-40.448 40.448z" /></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

1
vueJs/src/icons/svg/api.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M740.8 500.8H262.4l158.4-158.4H512c8 28.8 35.2 49.6 65.6 49.6 38.4 0 70.4-32 70.4-70.4s-32-70.4-70.4-70.4c-32 0-57.6 20.8-65.6 49.6h-107.2L206.4 500.8H156.8v40h148.8l182.4 182.4H576v49.6h139.2v-139.2H576v49.6h-70.4l-142.4-142.4h379.2v75.2l168-94.4-168-94.4v73.6z m-161.6-208c16 0 30.4 12.8 30.4 30.4s-14.4 28.8-30.4 28.8-30.4-12.8-30.4-30.4 14.4-28.8 30.4-28.8z m36.8 380.8h59.2v59.2h-59.2v-59.2z m164.8-179.2l46.4 27.2-46.4 27.2v-54.4z" /></svg>

After

Width:  |  Height:  |  Size: 729 B

1
vueJs/src/icons/svg/client.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="107.44px" viewBox="0 0 1220 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M823.532308 1024H397.390769a19.692308 19.692308 0 0 1 0-39.384615h426.141539a19.692308 19.692308 0 0 1 0 39.384615zM1122.461538 905.846154h-1024A98.461538 98.461538 0 0 1 0 807.384615v-708.923077A98.461538 98.461538 0 0 1 98.461538 0h1024A98.461538 98.461538 0 0 1 1220.923077 98.461538v708.923077a98.461538 98.461538 0 0 1-98.461539 98.461539zM98.461538 39.384615A59.076923 59.076923 0 0 0 39.384615 98.461538v708.923077A59.076923 59.076923 0 0 0 98.461538 866.461538h1024a59.076923 59.076923 0 0 0 59.076924-59.076923v-708.923077A59.076923 59.076923 0 0 0 1122.461538 39.384615z" /></svg>

After

Width:  |  Height:  |  Size: 872 B

1
vueJs/src/icons/svg/file-manager.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M958.976 977.408H70.656S0 988.16 0 893.952V131.584S1.536 46.592 88.064 46.592H399.36s37.888-7.68 69.12 40.96c29.696 47.104 47.104 76.8 47.104 76.8s10.752 12.8 36.352 12.8h400.896s70.656-7.68 70.656 70.656v650.752s10.752 78.848-64.512 78.848zM892.928 379.904c0-18.944-15.872-34.816-34.816-34.816H166.4c-20.48 0-36.352 15.872-36.352 34.816v3.072c0 20.48 15.872 36.352 36.352 36.352h691.712c18.944 0 34.816-15.872 34.816-36.352z" /></svg>

After

Width:  |  Height:  |  Size: 717 B

1
vueJs/src/icons/svg/file-storage.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M938.354 610.58H85.678V128.3H128.3V64.35h255.8l42.638 63.95h511.616z" fill="#F6BB42" /><path d="M980.978 674.53H43.04V192.25h42.638V128.3h255.798l42.624 63.95h596.878z" fill="#FFCE54" /><path d="M0.4 277.496h1023.2v682.154H0.4z" fill="#656D78" /><path d="M661.226 554.624c-23.514 0-42.624 19.14-42.624 42.624v21.326H405.428v-21.326c0-23.482-19.126-42.624-42.638-42.624-23.498 0-42.638 19.14-42.638 42.624v63.95c0 23.514 19.14 42.654 42.638 42.654h298.438c23.514 0 42.624-19.14 42.624-42.654v-63.95c-0.002-23.484-19.112-42.624-42.626-42.624z" fill="#F5F7FA" /></svg>

After

Width:  |  Height:  |  Size: 832 B

1
vueJs/src/icons/svg/file.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M853.333333 960H170.666667V64h469.333333l213.333333 213.333333z" fill="#90CAF9" /><path d="M821.333333 298.666667H618.666667V96z" fill="#E1F5FE" /></svg>

After

Width:  |  Height:  |  Size: 420 B

1
vueJs/src/icons/svg/folder.svg

@ -0,0 +1 @@
<svg class="icon" width="128" height="128" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M853.333333 256H469.333333l-85.333333-85.333333H170.666667c-46.933333 0-85.333333 38.4-85.333334 85.333333v170.666667h853.333334v-85.333334c0-46.933333-38.4-85.333333-85.333334-85.333333z" fill="#FFA000" /><path d="M853.333333 256H170.666667c-46.933333 0-85.333333 38.4-85.333334 85.333333v426.666667c0 46.933333 38.4 85.333333 85.333334 85.333333h682.666666c46.933333 0 85.333333-38.4 85.333334-85.333333V341.333333c0-46.933333-38.4-85.333333-85.333334-85.333333z" fill="#FFCA28" /></svg>

After

Width:  |  Height:  |  Size: 614 B

1
vueJs/src/icons/svg/global-setting.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M127.792013 127.778198l447.934892 0 0 255.959579L767.698125 383.737778l0 63.990407 63.989383 0L831.687508 319.748395 575.726905 63.788815 127.792013 63.788815c-35.18229 0-63.990407 28.807093-63.990407 63.990407l0 767.881808c0 35.18229 28.808116 63.989383 63.990407 63.989383l319.949986 0 0-63.989383L127.792013 895.66103 127.792013 127.778198zM643.717416 195.767686l125.292588 125.292588L643.717416 321.060273 643.717416 195.767686zM959.668321 741.247194l0-75.176167-66.113767-13.373589c-4.439102-16.749476-11.125385-32.558533-19.560498-47.240931l37.245276-56.178487-53.118801-53.120848-56.175417 37.247322c-14.685467-8.44023-30.43415-15.123442-47.244001-19.562545l-13.433964-66.113767-75.115791 0-13.433964 66.113767c-16.809851 4.439102-32.558533 11.122315-47.305399 19.562545l-56.116065-37.247322-53.122895 53.120848 37.249369 56.178487c-8.498558 14.682397-15.185864 30.491455-19.620873 47.240931l-66.059532 13.433964 0 75.115791 66.059532 13.433964c4.435009 16.809851 11.122315 32.618908 19.620873 47.240931l-37.249369 56.178487 53.122895 53.118801 56.116065-37.245276c14.745842 8.499581 30.495548 15.185864 47.305399 19.560498l13.433964 66.113767 75.115791 0 13.433964-66.113767c16.809851-4.374634 32.558533-11.06194 47.244001-19.560498l56.175417 37.245276 53.118801-53.118801-37.245276-56.178487c8.499581-14.622022 15.121396-30.43108 19.560498-47.240931L959.668321 741.247194zM703.644273 831.605132c-70.673619 0-127.917368-57.239656-127.917368-127.978766 0-70.676689 57.242725-127.97979 127.917368-127.97979 70.740134 0.063445 128.043235 57.366545 128.043235 127.97979C831.687508 774.3665 774.384407 831.605132 703.644273 831.605132z" /></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

1
vueJs/src/icons/svg/group.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M512 704.1c-4.7 0-9.4-1-13.8-3.1l-352-168.1c-11.2-5.4-18.3-16.7-18.2-29.2 0.1-12.4 7.4-23.7 18.8-28.8l88-40c16.1-7.3 35.1-0.2 42.4 15.9 7.3 16.1 0.2 35.1-15.9 42.4l-25.5 11.6L512 636.6l276.2-131.9-21.1-9.6c-16.1-7.3-23.2-26.3-15.9-42.4 7.3-16.1 26.3-23.2 42.4-15.9l83.7 38c11.3 5.1 18.6 16.4 18.8 28.8 0.1 12.4-7 23.8-18.2 29.2l-352 168.1c-4.5 2.1-9.2 3.2-13.9 3.2zM512 896.1c-4.7 0-9.4-1-13.8-3.1l-352-168.1c-11.2-5.4-18.3-16.7-18.2-29.2 0.1-12.4 7.4-23.7 18.8-28.8l88-40c16.1-7.3 35.1-0.2 42.4 15.9 7.3 16.1 0.2 35.1-15.9 42.4l-25.5 11.6L512 828.6l276.2-131.9-21.1-9.6c-16.1-7.3-23.2-26.3-15.9-42.4 7.3-16.1 26.3-23.2 42.4-15.9l83.7 38c11.3 5.1 18.6 16.4 18.8 28.8 0.1 12.4-7 23.8-18.2 29.2l-352 168.1c-4.5 2.1-9.2 3.2-13.9 3.2zM512.1 515c-4.5 0-9.1-1-13.3-2.9l-8.6-3.9c-0.1-0.1-0.2-0.1-0.3-0.2L146.4 346.5c-11.3-5.3-18.5-16.8-18.4-29.3 0.1-12.5 7.5-23.8 18.9-28.9l352-157.5c8.3-3.7 17.8-3.7 26.1 0l352 157.5c11.4 5.1 18.8 16.4 18.9 28.9 0.1 12.5-7.1 23.9-18.4 29.3L534.2 508c-0.1 0-0.1 0.1-0.2 0.1l-8.5 3.9c-4.3 2-8.8 3-13.4 3z m8.5-35.9zM236.7 318.3L512 447.7l275.3-129.5L512 195.1 236.7 318.3z" /></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

124
vueJs/src/icons/svg/identity-server.svg

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve"> <image id="image0" width="128" height="128" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAABmJLR0QA/wD/AP+gvaeTAAAA
CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AgLEiIS7dl/ggAAGDtJREFUeNrlnXucXVV1x7/r
zkweQwIkoCQC5jgzBNCqYKAIErXgCwRLrdWmCiptJZFWtKWCr+IDirX68QUkVaRoVRDrC8SaqrV+
UHkoRKpAkMxw0xBMqqgQnJDHzOofe5/nPe9z7r3n0l8+88m99+yzz9p7r7P23uu1RVV5PEJEhoEX
AMuBpwCHAEuARcBCYBSYCwigwB5gGtgB/Ab4X2ALcD9wH/BNVd3b73bV3k+PBwYQkVHgGcARwJOB
FwInduFRPwLWA21gI3Cnqj7a7/ZXwUAygIi0MG/yi4ALMYPfL9wNXIphjIdUdbbf/VMEA8UAIrIc
eC/wqn7TkoJ/A96pqvf2m5A8aDwDiMghwCrgPODgftNTAG3go8AXVPUX/SYmCY1kACvijwI+BDy/
3/TUgG8AbwXu1oZ1eOMYQEROwXTY4xUnquoP+k2Ei8YwgIisAj4DDHfpEVPAfwF3AduAhzDbPsVs
BecBBwBLgcOB52F2Fd3ATuCPVHV9l+rPjb4zgIg8FbOCPqSmKq8CvoQZZHegd5cRvSIiwAiwGMMY
S4GXAefUROstGEbYVlN9xaGqffnDvHHfxLyBVf7WA2dh3l7pIf2LgVfX1IargOG+jEOfBv/cih12
D3BkLwc8oz1i6bmzYrtO6TXtPZ0CRORA4HvAU0vcvht4LnCHqu7pGdHF2zgHWIGRTAtLVHED8ApV
3d0TenvFACLyB8B/lrh1EjNP/rQnhNbb5qOBr2LU00UxrqpT3aax1aOOuI7ig78R2E9VJwZx8AFU
dYOqLgOeAOwqePukiPxNt2nsqgQQkf0xlrUi2A5MDLqRJaE/DgTuxSwg8+I7wEu6ZYnsmgQQkcMp
PvjHqOqSx+PgA6jqr1T1AOCMAredDNwuIvO6QVNXJICIvBD4jwK3fB14WdPUpN2EiAwBG4CnF7ht
P1V9pFY66u5zEXkN8K8FblnaV0VInyEixwM/LHDLhKpO1vX8WqcAETmP/IN/DdAapMGfXjt29M51
41Jnnap6M0YplnfFv8maxWtBbXp3Eflr4CM5i79aVT9f17O7jem1Ywci/NJ+rX3dpKq7gHER+RRw
do5b7hWRJ9VhZq5lCrCGnLwDukRVt1d+aA8wvXbsEIxfYBCt0TVTXVuriMjpwPU5ix+qqg9UeV5l
CSAip5Jv8BWYb7m90ZheO3YwwjUistJ9QUQERRFqnQE6O0n1BmsguztH8XtE5CBVnS77vEoMYAm9
MUfRXcCCpnvVTq8dW4AxGa9AQUU9n2FPUnZ3/AFQ1XtE5GBga0bRBcBdIjJe1hexNAOIyGKMbT0L
jwL7NnmLN712bBHCJmCx+6Z75hm/vfSyCar6oFWk/TajqANcjbGIFkapBY2IzAd+laPoraq6sKmD
P712bMnOdeP3AL8Wq50zJlKvnV5ZtwlKT5ngYfJpDc8UkdVlnlFWAlxOtjDcCJzQve4pj53rxvYB
Pgac7fOmGx9iPgrmjReBEPv2mJVV9TcishTIWvGvFZHvq+rPitRfmAFE5HXA63MUfXrTfOSn1461
MFE+YyJiB9e+2cFRVvOmR8V+r6cBjxzVbSLyDOC/M4r+VETmFjElF5oCRGQJ8C85is5p6IJvqYiM
AUFnjqS2ehLARS/FfxTWIvrKHEU/WaTe3AxgY+025Ch6cIMdNjT6Rgfnef/3oEQIcUC/if8ixr08
DWdZz+pcKCIB1mCCK9Nwoqo+2Kf+yQNvCNPEeXDsG7h+/VCOMtdbz6RM5GIAG53zsYxin9EG+bvn
bFfHHG8+2B80Wr7fFINdV83PKDYMfDpPfXklQJZqUoHX9bVnCkJVY+d0EfG0fcHpwTBLv6n2aH8M
Exibhj8VkWVZdWUygIgcBxydUWxZU/f6qbAhIaGFXmBxGFIDq/ZEC5ibdNVvYQJp0vAVkXS5lcoA
dh65JeMhZ6nqFgYI7uJPRKyaN2U6AH/wm8fiWcqfo8mQFFkS4M9yEPG5fvdCEQQHOjjgHft9qwfw
C/Sb8k6o6k7gpRnFPpYmBRIZwG77Pp5R+ZFNU/bkQdrbDr462OgBwuuAJk0DltZvYMLfkrAceEnS
xTQJsAZjbUrCjaq6sd8dUBRm4LXjt6hOwP3csbRpoCQge0H4BRty34HYH+3cn7Xt+/N+t7oo3EHu
0PGIv/jzy2hordAvNXAeqOodpMddLCQhGitJAhyf8cz3DIpXTxBJb7NEynSuEXzmaKgEABOomoa1
cT92MIBdMPxzRmUf7ndryyK4tfN/i8zvEr3Hv3douIkmDmMwIn0tcKKIdOQ7iLMGHoNJkJCE9dZO
PdAILwI7rYHRct60MOxfHHecgzA5CF4J/BjYOtlulw7qHHecIYHZTe12WTlzLOnexadjzPQe4qaA
MzIekmdr2AiMDA+FGHyoFb9h8SSAhfs5qguIagNnZmeHLLdcB0yB7hpftmzHhON8ZdxxVo87y55U
kOTvAueXba+q3k86A1xid3ceQgwgIiPA21MquFVVf12WwF5AROaKyBEi8uO9M7N7JCrr4++x/7vF
4r1/VDU8OyizfhHrMCqyQNEzBNaCbJ1wHJ1wnAsnHGfJhOMMJdE94Tj7o7pS4QPjjlPFV/NdKddG
gOOCP0QlwHMzKr+kAmFdhYgsF5FfAI9hEkisiCkUvSe0A/D8Pj1O6HyOJtYZrFtCvyhcqvALhb3j
y5Z9ftxx4vIGvN/UpYhJPFkWX864HnrBowzwroyb/70CYbVDROaIyMUiopio21RztRB+280bLTFG
H3/eD+oHjKEoBiGJEdAu0skwIrJK4JFxx3lownFOBRh3ls0FzvHr4fwJxzmyTJ9YQ9HlKUVOFZG5
7hePAeyPz0u58ZKmePnYgX8bxt38Hbk7h8Bcjj/YQY1f2l4/8ZrrOOhli/G3j1jFk5gKrBUSBBYr
euO4s+xmlG8FlqTunbdOOE5ZvWOWz4CXkKsV92MCrihJTG0QkZaIvB8z8P9Qtp6g56+puFPt65bL
dB0LE4hbsRlk19QoQU8U77qVSc9GWBmUTvbpCxW9qGQTs+IJXuF+CDLAyzNuyuMG3jWIyF8AM8AF
9VTY+THIBCIBlzHXT0SkQ6R7wx2YHqIThffNX2USYgHLIOpeUzcCSS4ad5z9izbNOoWmheef76qG
W7ZhgsnclYQbe5W0KAoRWSQikxR0dkyu0P1PAgPeKWnVegar+uFgcZLDXAgKfvEyTwZXBqGnuM/0
5/xggyHMaNvHy00F7025diA277IrAZ4IpHmPfLCWzi8IEXk58GtgrLZKXdt/cLFmvX+jU0Bo4D2a
Ygn1agt6k/l7AUUDjBBon39P0EilQenAHIHTSrQ0y4H3GeAzwFEZhW+r0OWFISJD9q3/Ur01B3T8
EeVPMGdicEEY3QV0rOq9esPRI9HVgJXvvpgPMIXPPFYqCAR1FopeP+44aZbZzpaagNE0R53DwWeA
8ZSCO6pEnxaFTaS0lzrf+tAD/P/9AQ9r/zTc+SHFUEQR5C/2cMctWtZeFQl9lpCsUDq0j8HFoqky
T7RwFDekXDsefAZIS9z49a4MRAxEZAK8RAzdeEJoh+Yv8OK9hAJ0efcEr7ZaMiLBuk1homuKkGwI
zfvi/QumC/XliuevBnDouONk+WZGcWvKtdNEZMhlgBeXrKQ2iMixmLCt3kCCi7rwHB9SDBHxHgoM
7p69sw8q+nZVvSVG5RNZ/Plvujvnu9NEVMXcubX06rljwnGKZAtLyz00DzipZbNZTqQUvKlrg+C1
UZ5Fr9cZuFo+IirgyBQQkQi61985b9m6ZWayvfnSyc2bj59sbxZFR4DDBL5mnhF9q8P6AG+aiFlb
eLYF75tHzz8WaGZW9pCnt0gffMifvKgUbKze7d2oe2iotSrWXT0UFOr/HKvwCegAAGZmkr3oJtub
906225s2tdtnAEOqulTgiugCMRpsHLQmRDcZHb+JvGnccY7N2QVZ2VgOa5F9KELXkjaKyEJMLuA6
sQtj0m7t3TtzbfDCzGzL8+pJcpSNBoT6O7NiGUIm2+3Zyc2bt21qt89FmQu8Nbo5DE4oQWkR1Cf4
30Nbw9vGHSczpsMyf9oUfliL9IOYZrul/7fKp7oXfCtUdZ6qfi3pzfc6B+3Y3wcVdfFBo+VU85Ob
N+8W+KDgWft8ZVGcMihAbnSRqf69eVXhX0u5tqBFugKom/PyOszJnXXgDEzOwTtSSwXS43tWwMCg
a0Aed0gCqgWKKvx+ZL3p5yCw370BDywKY/UOho4Lxh0nz1Z5U8q1hcPA/ikFvle6xSmw8/4baqjq
FuD5eTOPBRd80VAvb/8figyOuV4C1sEjFGHlTgHqbfMM9wWtlBEO/KKiX0bZIiIPKvpLkN/leHwa
A8wfxhy1koT7S7U4BdYlqY55/7WqmhUbF0JwtR/S8Ytr/w8MemAaSAsiydVmOMUTLjFq4+A3+9tN
InKloj8U5IFN7fZjFfrptynX5g+THvzRDfevM2uo4xBVzTJ5xiIaGubFB6IdZeK2g0WlwITjjChc
jyoa4DAr+m/HHC75A+BBYPemdrvuSKs0I97IMOmx5r+tkxLrdHJVxWoWqWopuqLePtFBjvstro4i
UNUPmxUmZ4PeD2xHZKvCjsny3r9FkLaIHx4GhlIK7KyZmKo+haM2ILIU0hQ8SbYA85uvkS28DhB5
y2S7/Vc19F3pZqdca/XkyBjTDzIE/G2FKhZXGfwYekLfPe8fYjyDvDLFnzPZbjc1XxJgjEFpc06u
PDM58awK9x6rqr+pg4ikhZ23JYyJCm5wOFiuJqdc0xbGjToJZY49S0KhFXsAV6jqj+siokOEB8zC
4S2gllb8NAxpU/xMC0jbSz6hDgpEZD/Kn8P7pi51jEHMnsw4czYyQ1gZjKRc290i/WCnpTURcVjJ
+1ap6kxXuiWAaNRvnMdQnMvYgCBtm/9Yi/S9/ok1EXFUyfuuq7MnOnz+csQCuHCdRAeQCdKsvTtb
GAVEErJCxfLitSXuOavu9DOhgU4Q8dGMYaHfdSCnBSfl2u9awOaUAvPs9q00rNWvjCT5UTd6w/PY
CqiFwzoA//ewL8DAvfkuTk259nCLbL18VlbKLIyUvK/drR4Jb+t8T2DXQGSWBP6uYADf+iDS8gdt
aZFuLQI4tCIBZU+87MrZQp1jGVkH+OF8IT/PQWSCHPmC72sBN5PumPGcinSUiXXf0bXMozE2/sSF
3eCNeRQHZly/s2U7Oi3s+6h+t6JuRFPCJaWBjcsaMmDI8h1c79oC7kwpdHJFIsq4lC3MynFbFq6b
d578f8EzA+KSSw0A0rK9fVtV97gMkOaPf4RNHVMWZZ0ZqjwzEdG0L0kJIkP3BCREP08NKYEXpFz7
LviRQVln0fxeBSLKWsMOLnlfOiLbv1T7f1D7p+H7mw7rebUipchG8Blga0bTzilLiF1j/LTErVWY
LqtzEs8LCLl/R3wCk46YaSiyUsz8DCwDWNfvj6YUPqeiQqjIcfIuymbHyIWkrJ/RNz7oCpblLdQw
ZDmh3A/hDCGfzrhhUQViykT+rBCRp3ShY0IDmZQgKhYDYhCyL2ua1/XH3YO9ggzw84x6T69A0z0l
7/t2Fzon9H8hu//g2AKy9v9Xuh88BrA5ANJi0K+qsDXbVvK+MRsyXguS3vCQKjhQNs56OAgSgEAS
qAR42t+oT2BWgsJjylBjF4JlHSPvs2cVdw8Bo0/67qD5awAr/i9LKbIhmPAjygBfzaj/LRVou7rC
vevr6JwkT+CoM0hcOddSOAAS4KSM6xcHv4QYQFUfJTA/xGBVMMtkEajq7ygfaLJSRC4vea+HoAj3
BjoQC5h8kGTcGQKNxYUZ178Z/BLnFp7lhfO2CsS9oMK9bxSRSnEFeVTASW94JHVPIyEii0iXAB+I
5nuKY4Dvkq6/v0hESpl4VXUD1VLOvF1EbqhwfyciW7vkN9yVHLU+vW5ck3G9I5F0BwNYpdBZGRVV
2RKWcQ8L4jQR2Zb3bNwIIsk23GxdndbAqKdQ0yEi+5Ke62kbMV5WSZFBaUkFAK6rIAXupXrmsYOA
XTa3UKF+sp0VThahbr6AsH4g6AQ6AHEC52Vcj/WxjGUAO098JKPCd1cgNisvcV7cLiL3FNkmBkPD
o4u7Ds9fHYwFoIgsJT01LCTkekiLDczSxV8gIvuXIdiqIUvpFGJwBDAtIv+UhxHCoeEx4l3D5t+G
v/UuPptx/U1JuZ4TGUBVHyE7F3+WGTkRqno76cfTFMX5GEa4LGl6Gp6zBwKpYdLV/vExA03jBxFZ
Tvbef13Shazo4LUZ1w+1CR5LQVUvpf4UcecCO0VEReRPRkaGPZ9EVRhq+e4JoZNAxM8baGnrKOfW
0RRYrd+9GcVe6xp+4pDKADYiN+uUsNtEZJ8K7Tiuwr1ZuG7GHBy1XkSe9o4b9z2NkdnQ2cCBttpP
nXb/6DkCDcLrM67vAa5NK5AnP8B1ZOcK/E7ZFtjYv664f9n6GWq1XgT8bPuO2Y/b84ViNYBBm3/0
3KC4Y+P6CRE5jOwzFJ6Tdc5DnmSDM8ALM4odJyKlzxO0uoc6cxGEMDNrdj8L5oSTRXuQTjNxXNxg
U7aC1iqbZb6/S1Uzo6tyZQgxyZAzj4v9nIgUPSgx+Iw9lp7enUguof8ib3rSQVKNEAF50vfl8uYu
kiIma58JsLWssQiM2VhVjyTdPa08It4/ElDvpu73/dtOmL96qq8cICInASszip2b93Dv3AxgM3Ot
yFG0XdWnX1XfTLWUMkkVB79kKnY8p1HlKmBodM3UzbXTVAAiciTZ662fk7Lti6JQ2Jaq3iEi64DV
KcWWYDyLSh18GHjWBrvNuR94cpW6PIQOjQz+LLFvvSAPKfrk0TVTPTsxJZl0WUC+U0OeXSSsvkyW
sDcCd2SUOcKe71cJqjqrqsvIJ3kKwGeE+LRwAspR81dPHtiQwZ8L7MhR9I+LJtMqzADWvesPcxS9
QETeXUcH2CTQLaDIYQlxFbn1eV+10xL4CVUdGl0zdWfh+rsAKwUfzlF0napmnRvcgVJ5AlX1AeBp
OYpeJCIfqaMj7ALxQkzWq09UqStkA/AT8u9C2Gd0zdQ5o2um6k7XWpJOaWF8M7IW1lsp6XNZOlGk
qt5NtpYQ4DwRyYo5KPLcWVU9x9L+okI322Na3FV/YM9/+OiaqXmjq/sv7n1SZQ7mpNQ8OLxsMq1K
mUJV9Rrg73MUPUtEvlNnxK+VCN+ybVhOzukheFq4qr4LaM1fPZmlVOkpRGSU/Akyxq2/ZSlUThWr
qu8j3ZHUxUnArA1arA2WEe6z00MLE1MYe26uq/ex8/5+o2umLh5d0999fQeN5tzEvAO6UlUrnelU
S65gVf1Lsl3KXewRkWU5yxalQ1X1LlV9sW3bXMwRqR8FEBhGOGp09ZSMrp56pBs0VIGIvJj8x+ic
oKrfr6PTavsDvkL47KO0v9PrfHYO2uTMk4+QXj6zIH2XFei7V9b1XO8MnRq5+CqyzZQubsVYrLqe
DbSpsM6cebZ5Ll6qqt+o6/m1p4tX1bPJv18/DthrRd//O4jIeRQb/GfWOfhA/RIg0LjXUCwvwE3A
KVVWtIMCEXkixp3uoAK3Tahq3Wcs1i8BXKjqZ4FnF7hlJfCoiPxdtxJE9Rsi0rKKse0UG/yDujH4
QL2LwITFzUJMRvK8Cxz37y1YCTXof5gd6CUl+uCmbvdBLzvhfSU6QIH3A3P6PYgl2zwPswUt0+5V
PaGxxx3yXIyjYllGWNzvQc3ZzkXAB0u2cxo4tGe09qFz5ljRVqZz3L8zgZF+D3SkXcOWrirt+mSv
6e7aLiALIvI04CeUyyXsYiPmHMJrgQe0h42xC9UnYdKxrKb8kThgbP3LVbVsKp3y7egXA4Bn7nwD
2QEoeXGN/fsfYAvwsNagZLJ07ofJnL4UYwXNiqDOi9NVtWqwbPm29ZMBPCJMYMmngFd1ofodGBX1
TRh/ue32t8cw5lbFrNJd28G+wBOBMeAEzBt+QOGnZuNKjPPm7so1VUAjGMAjxsT0XU13GKEpuAJ4
s6aEa/USjWIAjyiRhRgRe1nVuhqENwDXqMnD1Bg0kgE84ozvwMmYgM8qWUn6hRuAyzGp2Rtp8Go0
A4QINeuE1Zhchl2LJawBezFh71foANg1BoYBQkQbZjgGeCfVMo/Vhe9hNJ23qWoe9+3GYCAZINQA
4zz5TIwr2Bgm/cxTu/jITZhsWxsxOZA3qGpXDrjqBQaeAWIbZQIpXoFhhMMxe/dRYB/MMXhzMQqo
YfyTAWYw4nsXsBOjkp3GbBvvBe4CfqKqpbOiNBH/B0FqVr+xTKbuAAAAJXRFWHRkYXRlOmNyZWF0
ZQAyMDIwLTA4LTExVDEwOjM0OjE4KzA4OjAwGwRgvgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0w
OC0xMVQxMDozNDoxOCswODowMGpZ2AIAAAAgdEVYdHNvZnR3YXJlAGh0dHBzOi8vaW1hZ2VtYWdp
Y2sub3JnvM8dnQAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1
bWI6OkltYWdlOjpIZWlnaHQAMTI4Q3xBgAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAxMjjQ
jRHdAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1U
aW1lADE1OTcxMTMyNTh1y5vhAAAAE3RFWHRUaHVtYjo6U2l6ZQAyMzQ4NEJClVgqKwAAAEV0RVh0
VGh1bWI6OlVSSQBmaWxlOi8vL2FwcC90bXAvaW1hZ2VsYy9pbWd2aWV3Ml85XzE1OTU0MTE0MTM4
MDcyODQyXzhfWzBdhNlx3QAAAABJRU5ErkJggg==" ></image>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

1
vueJs/src/icons/svg/identity.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M824.32 874.24H223.36c-64 0-115.84-51.84-115.84-115.84V314.24c0-64 51.84-115.84 115.84-115.84h600.96c64 0 115.84 51.84 115.84 115.84v444.16c-0.64 63.36-52.48 115.84-115.84 115.84zM223.36 262.4c-28.8 0-51.84 23.04-51.84 51.84v444.16c0 28.8 23.04 51.84 51.84 51.84h600.96c28.8 0 51.84-23.04 51.84-51.84V314.24c0-28.8-23.04-51.84-51.84-51.84H223.36z" /><path fill="#333333" d="M416 593.28H307.84c-48 0-86.4-39.04-86.4-86.4v-108.8c0-48 39.04-86.4 86.4-86.4H416c48 0 86.4 39.04 86.4 86.4v108.16c0 48-38.4 87.04-86.4 87.04z m-108.16-217.6c-12.8 0-22.4 10.24-22.4 22.4v108.16c0 12.8 10.24 22.4 22.4 22.4H416c12.8 0 22.4-10.24 22.4-22.4V398.08c0-12.8-10.24-22.4-22.4-22.4H307.84zM773.12 498.56h-172.8c-17.92 0-32-14.08-32-32s14.08-32 32-32h172.16c17.92 0 32 14.08 32 32s-14.08 32-31.36 32zM793.6 737.28H259.2c-17.92 0-32-14.08-32-32s14.08-32 32-32H793.6c17.92 0 32 14.08 32 32s-14.72 32-32 32z" /></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
vueJs/src/icons/svg/organization-unit.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="128.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M642.465374 52.211681c6.510503 0 19.531509 6.510503 19.531509 19.563423v169.624136c0 6.542417-6.478589 19.563423-19.531509 19.563423h-254.45216c-6.510503-6.510503-13.05292-13.05292-13.05292-26.073926V65.264601c0-6.574331 6.542417-19.563423 19.595338-19.563423h247.909742v6.510503z m0-52.211681h-254.45216c-39.158761 0-65.232687 32.584429-65.232687 65.264601v169.592221c0 32.584429 26.073926 65.264601 65.232687 65.264602h254.45216c39.126847 0 65.200773-32.680172 65.200773-65.264602V65.264601c0-32.648258-26.105841-65.264601-65.200773-65.264601M224.931497 815.440504v163.17746H61.817864v-163.17746h163.113633z m19.595337-52.179767H48.764944c-19.563423 0-32.584429 12.989092-32.584429 32.584429v195.76189c0 19.595338 13.05292 32.648258 32.584429 32.648258h195.729976c19.563423 0 32.584429-13.05292 32.584429-32.648258V795.845166c0.031914-19.595338-19.563423-32.584429-32.552515-32.584429m345.663031 52.179767v163.17746h-163.049804v-163.17746h163.049804z m13.116748-52.179767h-195.729975c-19.563423 0-32.584429 12.989092-32.58443 32.584429v195.76189c0 19.595338 13.05292 32.648258 32.58443 32.648258h195.729975c19.563423 0 32.584429-13.05292 32.58443-32.648258V795.845166c0.031914-19.595338-12.989092-32.584429-32.58443-32.584429m358.811694 52.179767v163.17746h-163.081718v-163.17746h163.081718z m13.084835-52.179767h-195.793805c-19.563423 0-32.552515 12.989092-32.552515 32.584429v195.76189c0 19.595338 12.957178 32.648258 32.552515 32.648258h195.793805c19.531509 0 32.584429-13.05292 32.584429-32.648258V795.845166c0-19.595338-13.05292-32.584429-32.584429-32.584429m-469.777473-417.438135c-13.05292 0-19.531509 6.446675-19.53151 19.563423v326.163436c0 12.989092 6.478589 19.531509 19.53151 19.531509s19.563423-6.542417 19.563423-19.531509v-326.163436c6.542417-13.116749-6.510503-19.563423-19.563423-19.563423M857.726859 456.660724H140.1673c-13.084835 0-19.595338 13.021006-19.595337 19.563424 0 6.606246 6.510503 26.169669 19.595337 26.169669h717.559559c13.021006 0 19.531509-13.05292 19.531509-19.563424 0-6.606246-6.510503-26.169669-19.531509-26.169669zM140.1673 456.660724c-13.084835 0-19.595338 13.021006-19.595337 19.563424v182.740883c0 13.05292 13.05292 19.531509 19.595337 19.53151 6.478589 0 19.563423-13.05292 19.563424-19.53151v-176.134638c-0.031914-13.148663-6.574331-26.169669-19.563424-26.169669zM857.726859 456.660724c-13.05292 0-19.563423 13.021006-19.563423 19.563424v182.740883c0 13.05292 13.05292 19.531509 19.563423 19.53151s19.531509-13.05292 19.531509-19.53151v-176.134638c0-13.148663-6.510503-26.169669-19.531509-26.169669z" /></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

1
vueJs/src/icons/svg/route.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="128px" height="120.47px" viewBox="0 0 1088 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M896 576h-288v384a64 64 0 0 1-64 64h-160a64 64 0 0 1-64-64V576H64a64 64 0 0 1-64-64V192a64 64 0 0 1 64-64h256V64a64 64 0 0 1 64-64h160a64 64 0 0 1 64 64v64h288l192 192v64zM384 960h160V576h-160v384z m160-896h-160v64h160V64z m320 128H64v320h800l160-160z" /></svg>

After

Width:  |  Height:  |  Size: 543 B

1
vueJs/src/icons/svg/tenant.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

22
vueJs/src/lang/zh.ts

@ -78,7 +78,9 @@ export default {
clients: '客户端管理', clients: '客户端管理',
apiresources: 'Api资源管理', apiresources: 'Api资源管理',
identityresources: '身份资源管理', identityresources: '身份资源管理',
organizationUnit: '组织机构管理' organizationUnit: '组织机构管理',
filemanagement: '文件管理',
filesystem: '文件系统'
}, },
navbar: { navbar: {
logOut: '退出登录', logOut: '退出登录',
@ -612,10 +614,26 @@ export default {
confirm: '确 定', confirm: '确 定',
correctEmailAddress: '正确的邮件地址', correctEmailAddress: '正确的邮件地址',
correctPhoneNumber: '正确的手机号码', correctPhoneNumber: '正确的手机号码',
operatingFast: '您的操作过快,请稍后再试!' operatingFast: '您的操作过快,请稍后再试!',
request404: '您所请求的资源不存在!'
}, },
messages: { messages: {
noNotifications: '没有通知', noNotifications: '没有通知',
noMessages: '没有消息' noMessages: '没有消息'
},
fileSystem: {
name: '名称',
creationTime: '创建时间',
lastModificationTime: '修改时间',
type: '类型',
folder: '文件夹',
file: '文件',
fileType: '{exten}文件',
size: '大小',
root: '文件系统',
download: '下载文件',
upload: '上传文件',
deleteFolder: '删除目录',
deleteFile: '删除文件'
} }
} }

1
vueJs/src/permission.ts

@ -4,7 +4,6 @@ import 'nprogress/nprogress.css'
import { Message } from 'element-ui' import { Message } from 'element-ui'
import { Route } from 'vue-router' import { Route } from 'vue-router'
import { UserModule } from '@/store/modules/user' import { UserModule } from '@/store/modules/user'
import { AbpConfigurationModule } from '@/store/modules/abp'
import { PermissionModule } from '@/store/modules/permission' import { PermissionModule } from '@/store/modules/permission'
import i18n from '@/lang' // Internationalization import i18n from '@/lang' // Internationalization
import settings from './settings' import settings from './settings'

3
vueJs/src/router/index.ts

@ -13,9 +13,9 @@ import taskRouter from './modules/task'
import adminRouter from './modules/admin' import adminRouter from './modules/admin'
import apigatewayRouter from './modules/apigateway' import apigatewayRouter from './modules/apigateway'
import identityServerRouter from './modules/identityServer' import identityServerRouter from './modules/identityServer'
import fileManagementRouter from './modules/file-management'
Vue.use(Router) Vue.use(Router)
/* /*
Note: sub-menu only appear when children.length>=1 Note: sub-menu only appear when children.length>=1
Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
@ -128,6 +128,7 @@ export const asyncRoutes: RouteConfig[] = [
adminRouter, adminRouter,
apigatewayRouter, apigatewayRouter,
identityServerRouter, identityServerRouter,
fileManagementRouter,
{ {
path: '*', path: '*',
component: () => import(/* webpackChunkName: "error-page-404" */ '@/views/error-page/404.vue'), component: () => import(/* webpackChunkName: "error-page-404" */ '@/views/error-page/404.vue'),

6
vueJs/src/router/modules/admin.ts

@ -6,7 +6,7 @@ const adminRouter: RouteConfig = {
component: Layout, component: Layout,
meta: { meta: {
title: 'admin', title: 'admin',
icon: 'manager', icon: 'admin',
roles: ['AbpIdentity.Users', 'AbpIdentity.Roles', 'AbpSettingManagement.Settings', 'AbpTenantManagement.Tenants'], // you can set roles in root nav roles: ['AbpIdentity.Users', 'AbpIdentity.Roles', 'AbpSettingManagement.Settings', 'AbpTenantManagement.Tenants'], // you can set roles in root nav
alwaysShow: true // will always show the root menu alwaysShow: true // will always show the root menu
}, },
@ -47,7 +47,7 @@ const adminRouter: RouteConfig = {
name: 'tenants', name: 'tenants',
meta: { meta: {
title: 'tenants', title: 'tenants',
icon: 'tenants', icon: 'tenant',
roles: ['AbpTenantManagement.Tenants'] roles: ['AbpTenantManagement.Tenants']
} }
}, },
@ -57,7 +57,7 @@ const adminRouter: RouteConfig = {
name: 'organization-unit', name: 'organization-unit',
meta: { meta: {
title: 'organizationUnit', title: 'organizationUnit',
icon: 'tenants', icon: 'organization-unit',
roles: ['AbpIdentity.OrganizationUnits'] roles: ['AbpIdentity.OrganizationUnits']
} }
} }

6
vueJs/src/router/modules/apigateway.ts

@ -6,7 +6,7 @@ const apigatewayRouter: RouteConfig = {
component: Layout, component: Layout,
meta: { meta: {
title: 'apigateway', title: 'apigateway',
icon: 'manager', icon: 'api-gateway',
roles: ['ApiGateway.RouteGroup', 'ApiGateway.Global', 'ApiGateway.Route', 'ApiGateway.DynamicRoute', 'ApiGateway.AggregateRoute'], roles: ['ApiGateway.RouteGroup', 'ApiGateway.Global', 'ApiGateway.Route', 'ApiGateway.DynamicRoute', 'ApiGateway.AggregateRoute'],
alwaysShow: true alwaysShow: true
}, },
@ -27,7 +27,7 @@ const apigatewayRouter: RouteConfig = {
name: 'global', name: 'global',
meta: { meta: {
title: 'global', title: 'global',
icon: 'global', icon: 'global-setting',
roles: ['ApiGateway.Global'] roles: ['ApiGateway.Global']
} }
}, },
@ -47,7 +47,7 @@ const apigatewayRouter: RouteConfig = {
name: 'aggregateRoute', name: 'aggregateRoute',
meta: { meta: {
title: 'aggregateRoute', title: 'aggregateRoute',
icon: 'aggregateRoute', icon: 'aggregate',
roles: ['ApiGateway.AggregateRoute'] roles: ['ApiGateway.AggregateRoute']
} }
} }

27
vueJs/src/router/modules/file-management.ts

@ -0,0 +1,27 @@
import { RouteConfig } from 'vue-router'
import Layout from '@/layout/index.vue'
const fileManagementRouter: RouteConfig = {
path: '/file-management',
component: Layout,
meta: {
title: 'filemanagement',
icon: 'file-manager',
roles: ['AbpFileManagement.FileSystem'],
alwaysShow: true
},
children: [
{
path: 'file-system',
component: () => import('@/views/file-management/index.vue'),
name: 'filesystem',
meta: {
title: 'filesystem',
icon: 'file-storage',
roles: ['AbpFileManagement.FileSystem']
}
}
]
}
export default fileManagementRouter

8
vueJs/src/router/modules/identityServer.ts

@ -6,7 +6,7 @@ const identityServerRouter: RouteConfig = {
component: Layout, component: Layout,
meta: { meta: {
title: 'identityServer', title: 'identityServer',
icon: 'manager', icon: 'identity-server',
roles: ['IdentityServer.Clients', 'IdentityServer.ApiResources', 'IdentityServer.IdentityResources'], roles: ['IdentityServer.Clients', 'IdentityServer.ApiResources', 'IdentityServer.IdentityResources'],
alwaysShow: true alwaysShow: true
}, },
@ -17,7 +17,7 @@ const identityServerRouter: RouteConfig = {
name: 'clients', name: 'clients',
meta: { meta: {
title: 'clients', title: 'clients',
icon: 'clients', icon: 'client',
roles: ['IdentityServer.Clients'] roles: ['IdentityServer.Clients']
} }
}, },
@ -27,7 +27,7 @@ const identityServerRouter: RouteConfig = {
name: 'apiresources', name: 'apiresources',
meta: { meta: {
title: 'apiresources', title: 'apiresources',
icon: 'apiresources', icon: 'api',
roles: ['IdentityServer.ApiResources'] roles: ['IdentityServer.ApiResources']
} }
}, },
@ -37,7 +37,7 @@ const identityServerRouter: RouteConfig = {
name: 'identityresources', name: 'identityresources',
meta: { meta: {
title: 'identityresources', title: 'identityresources',
icon: 'identityresources', icon: 'identity',
roles: ['IdentityServer.IdentityResources'] roles: ['IdentityServer.IdentityResources']
} }
} }

4
vueJs/src/store/index.ts

@ -7,12 +7,12 @@ import { IErrorLogState } from './modules/error-log'
import { IPermissionState } from './modules/permission' import { IPermissionState } from './modules/permission'
import { ISettingsState } from './modules/settings' import { ISettingsState } from './modules/settings'
import { IRoleState } from './modules/role' import { IRoleState } from './modules/role'
import { IAbpConfigurationState } from './modules/abp' import { IAbpState } from './modules/abp'
Vue.use(Vuex) Vue.use(Vuex)
export interface IRootState { export interface IRootState {
abp: IAbpConfigurationState abp: IAbpState
app: IAppState app: IAppState
user: IUserState user: IUserState
tagsView: ITagsViewState tagsView: ITagsViewState

27
vueJs/src/store/modules/abp.ts

@ -1,16 +1,17 @@
import store from '@/store' import store from '@/store'
import i18n from '@/lang/index'
import { getItemJson, setItem } from '@/utils/localStorage' import { getItemJson, setItem } from '@/utils/localStorage'
import AbpConfigurationService, { IAbpConfiguration, AbpConfiguration as AbpConfig } from '@/api/abpconfiguration' import AbpConfigurationService, { IAbpConfiguration, AbpConfiguration as AbpConfig } from '@/api/abpconfiguration'
import { VuexModule, Module, Mutation, Action, getModule } from 'vuex-module-decorators' import { VuexModule, Module, Mutation, Action, getModule } from 'vuex-module-decorators'
export interface IAbpConfigurationState { export interface IAbpState {
configuration: IAbpConfiguration configuration: IAbpConfiguration
} }
const abpConfigurationKey = 'vue_admin_abp_configuration' const abpConfigurationKey = 'vue_admin_abp_configuration'
@Module({ dynamic: true, store, name: 'abpconfiguration' }) @Module({ dynamic: true, store, name: 'abp' })
class AbpConfiguration extends VuexModule implements IAbpConfigurationState { class AbpConfiguration extends VuexModule implements IAbpState {
configuration = getItemJson(abpConfigurationKey) || new AbpConfig() configuration = getItemJson(abpConfigurationKey) || new AbpConfig()
@Mutation @Mutation
@ -19,11 +20,29 @@ class AbpConfiguration extends VuexModule implements IAbpConfigurationState {
setItem(abpConfigurationKey, JSON.stringify(configuration)) setItem(abpConfigurationKey, JSON.stringify(configuration))
} }
@Mutation
private SET_ABPLOCALIZER(configuration: IAbpConfiguration) {
const { twoLetterIsoLanguageName } = configuration.localization.currentCulture
const resources: { [key: string]: any} = {}
Object.keys(configuration.localization.values).forEach(key => {
const resource = configuration.localization.values[key]
if (typeof resource !== 'object') return
Object.keys(resource).forEach(key2 => {
if (/'{|{/g.test(resource[key2])) {
resource[key2] = resource[key2].replace(/'{|{/g, '{{').replace(/}'|}/g, '}}')
}
})
resources[key] = resource
})
i18n.mergeLocaleMessage(twoLetterIsoLanguageName as string, resources)
}
@Action({ rawError: true }) @Action({ rawError: true })
public async GetAbpConfiguration() { public async GetAbpConfiguration() {
const config = await AbpConfigurationService.getAbpConfiguration() const config = await AbpConfigurationService.getAbpConfiguration()
this.SET_ABPCONFIGURATION(config) this.SET_ABPCONFIGURATION(config)
this.SET_ABPLOCALIZER(config)
} }
} }
export const AbpConfigurationModule = getModule(AbpConfiguration) export const AbpModule = getModule(AbpConfiguration)

4
vueJs/src/store/modules/permission.ts

@ -2,7 +2,7 @@ import { VuexModule, Module, Mutation, Action, getModule } from 'vuex-module-dec
import { RouteConfig } from 'vue-router' import { RouteConfig } from 'vue-router'
import { asyncRoutes, constantRoutes } from '@/router' import { asyncRoutes, constantRoutes } from '@/router'
import store from '@/store' import store from '@/store'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
const hasPermission = (roles: string[], route: RouteConfig) => { const hasPermission = (roles: string[], route: RouteConfig) => {
if (route.meta && route.meta.roles) { if (route.meta && route.meta.roles) {
@ -51,7 +51,7 @@ class Permission extends VuexModule implements IPermissionState {
@Action @Action
public async GetPermissions(userId: string) { public async GetPermissions(userId: string) {
const authPermissions = new Array<string>() const authPermissions = new Array<string>()
const grantedPolicies = AbpConfigurationModule.configuration.auth.grantedPolicies const grantedPolicies = AbpModule.configuration.auth.grantedPolicies
if (grantedPolicies) { if (grantedPolicies) {
Object.keys(grantedPolicies).forEach(key => { Object.keys(grantedPolicies).forEach(key => {
if (grantedPolicies[key]) { if (grantedPolicies[key]) {

13
vueJs/src/store/modules/user.ts

@ -6,7 +6,7 @@ import { resetRouter } from '@/router'
import { TagsViewModule } from './tags-view' import { TagsViewModule } from './tags-view'
import { removeTenant, setTenant } from '@/utils/sessions' import { removeTenant, setTenant } from '@/utils/sessions'
import { PermissionModule } from '@/store/modules/permission' import { PermissionModule } from '@/store/modules/permission'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
import store from '@/store' import store from '@/store'
export interface IUserState { export interface IUserState {
@ -137,13 +137,14 @@ class User extends VuexModule implements IUserState {
@Action @Action
public RefreshSession() { public RefreshSession() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const token = getItem(refreshTokenKey) const refreshToken = getItem(refreshTokenKey)
if (token) { const token = getItem(tokenKey)
UserApiService.refreshToken(token).then(result => { if (token && refreshToken) {
UserApiService.refreshToken(token, refreshToken).then(result => {
const token = result.token_type + ' ' + result.access_token const token = result.token_type + ' ' + result.access_token
this.SET_TOKEN(token) this.SET_TOKEN(token)
this.SET_REFRESHTOKEN(result.refresh_token) this.SET_REFRESHTOKEN(result.refresh_token)
return resolve(result) return resolve(token)
}).catch(error => { }).catch(error => {
return reject(error) return reject(error)
}) })
@ -161,7 +162,7 @@ class User extends VuexModule implements IUserState {
@Action @Action
private async PostLogin() { private async PostLogin() {
await AbpConfigurationModule.GetAbpConfiguration() await AbpModule.GetAbpConfiguration()
} }
} }

39
vueJs/src/utils/request.ts

@ -1,5 +1,5 @@
import axios from 'axios' import axios from 'axios'
import i18n from 'vue-i18n' import i18n from '@/lang/index'
import { MessageBox, Notification } from 'element-ui' import { MessageBox, Notification } from 'element-ui'
import { UserModule } from '@/store/modules/user' import { UserModule } from '@/store/modules/user'
import { getTenant } from '@/utils/sessions' import { getTenant } from '@/utils/sessions'
@ -40,19 +40,19 @@ service.interceptors.request.use(
) )
function l(name: string) { function l(name: string) {
return i18n.prototype.t(name).toString() return i18n.tc(name)
} }
function showError(error: any, status: number) { function showError(error: any, status: number) {
let message = '' let message = ''
let title = '' let title = ''
if (typeof error === 'string') { if (error && error.error) {
message = error if (error.error.details) {
} else if (error.error.details) {
message = error.error.details message = error.error.details
title = error.error.message title = error.error.message
} else if (error.error.message) { } else if (error.error.message) {
message = error.error.message message = error.error.message
}
} else { } else {
switch (status) { switch (status) {
case 400: case 400:
@ -60,23 +60,23 @@ function showError(error: any, status: number) {
message = error.error_description message = error.error_description
break break
case 401: case 401:
title = l('AbpAccount.DefaultErrorMessage401') title = l('AbpUi.DefaultErrorMessage401')
message = l('AbpAccount:DefaultErrorMessage401Detail') message = l('AbpUi.DefaultErrorMessage401Detail')
break break
case 403: case 403:
title = l('AbpAccount:DefaultErrorMessage403') title = l('AbpUi.DefaultErrorMessage403')
message = l('AbpAccount.DefaultErrorMessage403Detail') message = l('AbpUi.DefaultErrorMessage403Detail')
break break
case 404: case 404:
title = l('AbpAccount.DefaultErrorMessage404') title = l('AbpUi.DefaultErrorMessage404')
message = l('AbpAccount.DefaultErrorMessage404Detail') message = l('AbpUi.DefaultErrorMessage404Detail')
break break
case 429: case 429:
message = l('global.operatingFast') message = l('global.operatingFast')
break break
case 500: case 500:
title = l('AbpAccount.500Message') title = l('AbpUi.500Message')
message = l('AbpAccount.InternalServerErrorMessage') message = l('AbpUi.InternalServerErrorMessage')
break break
default: default:
break break
@ -96,7 +96,12 @@ service.interceptors.response.use(
return response return response
}, },
(error) => { (error) => {
showError(error.response.data, error.response.status) if (error.response.status === 401) {
UserModule.RefreshSession().then(token => {
const config = error.response.config
config.headers.Authorization = token
return service(config)
}).catch(() => {
MessageBox.confirm( MessageBox.confirm(
l('login.tokenExprition'), l('login.tokenExprition'),
l('login.confirmLogout'), l('login.confirmLogout'),
@ -107,8 +112,12 @@ service.interceptors.response.use(
}).then(() => { }).then(() => {
UserModule.ResetToken() UserModule.ResetToken()
location.reload() // To prevent bugs from vue-router location.reload() // To prevent bugs from vue-router
return Promise.reject(error)
}) })
})
} else {
showError(error.response.data, error.response.status)
}
return Promise.reject(error)
} }
) )

4
vueJs/src/views/admin/settings/components/SettingEditForm.vue

@ -633,7 +633,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator' import { Component, Prop, Vue } from 'vue-property-decorator'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
import SettingService, { Setting, SettingUpdate, SettingsUpdate } from '@/api/settings' import SettingService, { Setting, SettingUpdate, SettingsUpdate } from '@/api/settings'
const booleanStrings = ['True', 'true', 'False', 'false'] const booleanStrings = ['True', 'true', 'False', 'false']
@ -652,7 +652,7 @@ export default class extends Vue {
private settingChangeKeys = new Array<string>() private settingChangeKeys = new Array<string>()
get definedLanguages() { get definedLanguages() {
const languages = AbpConfigurationModule.configuration.localization.languages.map((lang: any) => { const languages = AbpModule.configuration.localization.languages.map((lang: any) => {
return lang.cultureName return lang.cultureName
}) })
return languages return languages

7
vueJs/src/views/admin/settings/index.vue

@ -3,6 +3,7 @@
tab-position="left" tab-position="left"
> >
<el-tab-pane <el-tab-pane
v-if="!currentTenantId"
:label="$t('settings.globalSetting')" :label="$t('settings.globalSetting')"
> >
<GlobalSettingEditForm /> <GlobalSettingEditForm />
@ -28,7 +29,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator' import { Component, Vue } from 'vue-property-decorator'
import { UserModule } from '@/store/modules/user' import { UserModule } from '@/store/modules/user'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
import UserSettingEditForm from './components/UserSettingEditForm.vue' import UserSettingEditForm from './components/UserSettingEditForm.vue'
import TenantSettingEditForm from './components/TenantSettingEditForm.vue' import TenantSettingEditForm from './components/TenantSettingEditForm.vue'
import GlobalSettingEditForm from './components/GlobalSettingEditForm.vue' import GlobalSettingEditForm from './components/GlobalSettingEditForm.vue'
@ -43,8 +44,8 @@ import GlobalSettingEditForm from './components/GlobalSettingEditForm.vue'
}) })
export default class extends Vue { export default class extends Vue {
get currentTenantId() { get currentTenantId() {
if (AbpConfigurationModule.configuration.currentTenant.isAvailable) { if (AbpModule.configuration.currentTenant.isAvailable) {
return AbpConfigurationModule.configuration.currentTenant.id return AbpModule.configuration.currentTenant.id
} }
return '' return ''
} }

437
vueJs/src/views/file-management/index.vue

@ -0,0 +1,437 @@
<template>
<div class="app-container">
<div class="filter-container">
<el-page-header
@back="handleGoToLastFolder"
>
<template
slot="content"
class="file-system-page"
>
<el-breadcrumb
ref="fileSystemBreadCrumb"
separator-class="el-icon-arrow-right"
>
<el-breadcrumb-item
v-for="(fileRoot, index) in fileSystemRoot"
:key="index"
class="file-system-breadcrumb"
@click.native="(event) => handleBreadCrumbClick(event, index)"
>
{{ fileRoot }}
</el-breadcrumb-item>
</el-breadcrumb>
</template>
</el-page-header>
</div>
<el-table
ref="fileSystemTable"
v-loading="fileSystemListLoading"
row-key="name"
:data="fileSystemList"
border
fit
highlight-current-row
style="width: 100%;"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChanged"
@row-click="handleRowClick"
@row-dblclick="handleRowDoubleClick"
>
<el-table-column
type="selection"
width="50"
align="center"
/>
<el-table-column
:label="$t('fileSystem.name')"
prop="name"
sortable
width="350"
align="left"
>
<template slot-scope="{row}">
<svg-icon
:name="row.type | fileSystemTypeIconFilter"
:class="row.type | fileSystemTypeIconClassFilter"
/>
<span>{{ row.name }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('fileSystem.creationTime')"
prop="creationTime"
sortable
width="200"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.creationTime | dateTimeFilter }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('fileSystem.lastModificationTime')"
prop="lastModificationTime"
sortable
width="200"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.lastModificationTime | dateTimeFilter }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('fileSystem.type')"
prop="type"
sortable
width="150"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.type === 0 ? $t('fileSystem.folder') : $t('fileSystem.fileType', {exten: row.extension}) }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('fileSystem.size')"
prop="size"
sortable
width="200"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.size | fileSystemSizeFilter }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('global.operaActions')"
align="center"
width="250"
min-width="250"
fixed="right"
>
<template slot-scope="{row}">
<el-button
:disabled="row.type === 0 ? !checkPermission(['AbpFileManagement.FileSystem.Delete']) : !checkPermission(['AbpFileManagement.FileSystem.FileManager.Delete'])"
size="mini"
type="danger"
@click="handleDeleteFolderOrFile(row)"
>
{{ row.type === 0 ? $t('fileSystem.deleteFolder') : $t('fileSystem.deleteFile') }}
</el-button>
<el-dropdown
class="options"
@command="handleFileSystemCommand"
>
<el-button
v-permission="['AbpFileManagement.FileSystem']"
size="mini"
type="info"
>
{{ $t('global.otherOpera') }}<i class="el-icon-arrow-down el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-permission="['AbpFileManagement.FileSystem.FileManager.Create']"
:command="{key: 'upload', row}"
>
{{ $t('fileSystem.upload') }}
</el-dropdown-item>
<el-dropdown-item
v-permission="['AbpFileManagement.FileSystem.FileManager.Download']"
divided
:command="{key: 'download', row}"
:disabled="downloading || row.type === 0"
>
{{ $t('fileSystem.download') }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<Pagination
v-show="fileSystemCount>0"
:total="fileSystemCount"
:page.sync="fileSystemGetFilter.skipCount"
:limit.sync="fileSystemGetFilter.maxResultCount"
@pagination="handleGetFileSystemList"
/>
</div>
</template>
<script lang="ts">
import { dateFormat } from '@/utils'
import { checkPermission } from '@/utils/permission'
import { Component, Vue } from 'vue-property-decorator'
import Pagination from '@/components/Pagination/index.vue'
import FileSystemService, { FileSystem, FileSystemGetByPaged, FileSystemType } from '@/api/filemanagement'
const kbUnit = 1 * 1024
const mbUnit = kbUnit * 1024
const gbUnit = mbUnit * 1024
@Component({
name: 'FileManagement',
components: {
Pagination
},
filters: {
dateTimeFilter(datetime: string) {
const date = new Date(datetime)
return dateFormat(date, 'YYYY-mm-dd HH:MM')
},
fileSystemTypeIconFilter(type: FileSystemType) {
if (type === FileSystemType.Folder) {
return 'folder'
}
return 'file'
},
fileSystemTypeIconClassFilter(type: FileSystemType) {
if (type === FileSystemType.Folder) {
return 'folder-icon'
}
return 'file-icon'
},
fileSystemTypeFilter(type: FileSystemType) {
if (type === FileSystemType.Folder) {
return 'fileSystem.folder'
}
return 'fileSystem.fileType'
},
fileSystemSizeFilter(size: number) {
if (size > gbUnit) {
let gb = Math.round(size / gbUnit)
if (gb < 1) {
gb = 1
}
return gb + ' GB'
}
if (size > mbUnit) {
let mb = Math.round(size / mbUnit)
if (mb < 1) {
mb = 1
}
return mb + ' MB'
}
let kb = Math.round(size / kbUnit)
if (kb < 1) {
kb = 1
}
return kb + ' KB'
}
},
methods: {
checkPermission,
tableRowClassName(row: any) {
if (row.row.type === 0) {
return 'folder-row'
}
return 'file-row'
}
}
})
export default class extends Vue {
private downloading!: boolean
private lastFilePath!: string
private fileSystemRoot!: string[]
private fileSystemList?: FileSystem[]
private fileSystemCount!: number
private fileSystemListLoading!: boolean
private fileSystemGetFilter!: FileSystemGetByPaged
constructor() {
super()
this.lastFilePath = ''
this.fileSystemCount = 0
this.downloading = false
this.fileSystemListLoading = false
this.fileSystemRoot = new Array<string>()
this.fileSystemList = new Array<FileSystem>()
this.fileSystemGetFilter = new FileSystemGetByPaged()
}
mounted() {
this.fileSystemRoot.push(this.$t('fileSystem.root').toString())
this.handleGetFileSystemList()
}
private handleGetFileSystemList() {
this.fileSystemListLoading = true
FileSystemService.getFileSystemList(this.fileSystemGetFilter).then(res => {
this.fileSystemCount = res.totalCount
this.fileSystemList = res.items
}).finally(() => {
this.fileSystemListLoading = false
})
}
private handleSelectionChanged(selection: any, row: any) {
console.log(row)
}
private handleRowClick(row: any) {
const table = this.$refs.fileSystemTable as any
table.toggleRowSelection(row)
}
private handleRowDoubleClick(row: any) {
if (row.type === FileSystemType.Folder) {
this.fileSystemRoot.push(row.name)
this.navigationToFilePath()
}
}
private handleBreadCrumbClick(event: any, index: number) {
// ,
if ((index + 1) < this.fileSystemRoot.length) {
this.fileSystemRoot.splice(index + 1)
this.navigationToFilePath()
}
}
private navigationToFilePath() {
const fileSystemPathArray = this.fileSystemRoot.slice(1)
const fileSystemPath = fileSystemPathArray.join('/')
this.fileSystemGetFilter.parent = fileSystemPath
this.handleGetFileSystemList()
}
private handleGoToLastFolder() {
if (this.fileSystemRoot.length > 1) {
this.fileSystemRoot.splice(this.fileSystemRoot.length - 1)
this.navigationToFilePath()
}
}
private handleDeleteFolderOrFile(row: any) {
this.$confirm(this.l('global.whetherDeleteData', { name: row.name }),
this.l('global.questingDeleteByMessage',
{ message: row.type === 0 ? this.l('fileSystem.folder') : this.l('fileSystem.file') }), {
callback: (action) => {
if (action === 'confirm') {
if (row.type === 0) {
let path = row.name
if (row.parent) {
path = row.parent + '/' + row.name
}
FileSystemService.deleteFolder(path).then(() => {
this.$notify.success(this.l('global.dataHasBeenDeleted', { name: row.name }))
this.handleGetFileSystemList()
})
} else {
FileSystemService.deleteFile(row.parent, row.name).then(() => {
this.$notify.success(this.l('global.dataHasBeenDeleted', { name: row.name }))
this.handleGetFileSystemList()
})
}
}
}
})
}
private handleFileSystemCommand(command: { key: string, row: any}) {
switch (command.key) {
case 'download':
this.handleDownloadFile(command.row.parent, command.row.name, command.row.size)
break
case 'upload':
if (command.row.type === 0) {
this.handleUploadFile(command.row.name)
} else {
this.handleUploadFile(command.row.parent)
}
break
}
}
private handleUploadFile(path: string) {
console.log(path)
// TODO:
}
private handleDownloadFile(path: string, fileName: string, size: number) {
this.downloading = true
const blobs = new Array<BlobPart>()
this.downlodFile(path, fileName, size, 0, blobs,
(downloadSize: number) => {
if (downloadSize >= size) {
this.downloading = false
//
blobs.length = 0
}
})
}
private downlodFile(path: string, fileName: string, size: number, currentByte: number, blobs: BlobPart[], callback: Function) {
FileSystemService.downlodFle(fileName, path, currentByte).then((res: any) => {
//
const downloadByte = res.data.size
//
blobs.push(res.data)
currentByte += downloadByte
if (size > currentByte) {
this.downlodFile(path, fileName, size, currentByte, blobs, callback)
} else {
//
const url = window.URL.createObjectURL(new Blob(blobs, { type: res.headers['content-type'] }))
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', fileName)
document.body.appendChild(link)
link.click()
//
callback(size)
}
})
}
private l(name: string, values?: any[] | { [key: string]: any }) {
return this.$t(name, values).toString()
}
}
</script>
<style lang="scss" scoped>
.options {
vertical-align: top;
margin-left: 20px;
}
.el-dropdown + .el-dropdown {
margin-left: 15px;
}
.el-icon-arrow-down {
font-size: 12px;
}
</style>
<style lang="scss">
.el-table .folder-row {
cursor: pointer;
background-color:rgb(245, 235, 226);
}
.el-table .file-row {
cursor: pointer;
background-color: rgb(210, 219, 235);
}
.file-system-breadcrumb .el-breadcrumb__inner {
color: rgb(34, 34, 173);
cursor: pointer;
}
.file-icon {
margin-left: 0px;
margin-right: 5px;
margin-top: 0px;
margin-bottom: 0px;
color: rgb(55, 189, 189);
}
.folder-icon {
margin-left: 0px;
margin-right: 5px;
margin-top: 0px;
margin-bottom: 0px;
color: rgb(235, 130, 33);
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save