Browse Source

improve the file management module and add some icons

pull/51/head
cKey 5 years ago
parent
commit
c325776b02
  1. 87
      aspnet-core/database/ApiGateway-Init.sql
  2. 1
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/AbpFileManagementApplicationContractsModule.cs
  3. 1
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCopyOrMoveDto.cs
  4. 1
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileCreateDto.cs
  5. 1
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileDeleteDto.cs
  6. 15
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemDownloadDto.cs
  7. 1
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/FileSystemGetDto.cs
  8. 2
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application.Contracts/LINGYUN/Abp/FileManagement/Permissions/AbpFileManagementPermissions.cs
  9. 27
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.Application/LINGYUN/Abp/FileManagement/FileSystemAppService.cs
  10. 93
      aspnet-core/modules/file-management/LINGYUN.Abp.FileManagement.HttpApi/LINGYUN/Abp/FileManagement/FileSystemController.cs
  11. 10
      aspnet-core/services/admin/LINGYUN.BackendAdminApp.Host/BackendAdminHostModule.cs
  12. 11
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/AppPlatformHttpApiHostModule.cs
  13. 4
      vueJs/src/App.vue
  14. 13
      vueJs/src/api/filemanagement.ts
  15. 7
      vueJs/src/api/users.ts
  16. 33
      vueJs/src/components/LangSelect/index.vue
  17. 12
      vueJs/src/icons/components/admin.ts
  18. 12
      vueJs/src/icons/components/aggregate.ts
  19. 12
      vueJs/src/icons/components/api-gateway.ts
  20. 12
      vueJs/src/icons/components/api.ts
  21. 12
      vueJs/src/icons/components/client.ts
  22. 12
      vueJs/src/icons/components/file-manager.ts
  23. 12
      vueJs/src/icons/components/file-storage.ts
  24. 12
      vueJs/src/icons/components/file.ts
  25. 12
      vueJs/src/icons/components/folder.ts
  26. 12
      vueJs/src/icons/components/global-setting.ts
  27. 12
      vueJs/src/icons/components/group.ts
  28. 12
      vueJs/src/icons/components/identity-server.ts
  29. 12
      vueJs/src/icons/components/identity.ts
  30. 20
      vueJs/src/icons/components/index.ts
  31. 2
      vueJs/src/icons/components/manager.ts
  32. 12
      vueJs/src/icons/components/organization-unit.ts
  33. 2
      vueJs/src/icons/components/role.ts
  34. 12
      vueJs/src/icons/components/route.ts
  35. 12
      vueJs/src/icons/components/tenant.ts
  36. 1
      vueJs/src/icons/svg/admin.svg
  37. 1
      vueJs/src/icons/svg/aggregate.svg
  38. 1
      vueJs/src/icons/svg/api-gateway.svg
  39. 1
      vueJs/src/icons/svg/api.svg
  40. 1
      vueJs/src/icons/svg/client.svg
  41. 1
      vueJs/src/icons/svg/file-manager.svg
  42. 1
      vueJs/src/icons/svg/file-storage.svg
  43. 1
      vueJs/src/icons/svg/file.svg
  44. 1
      vueJs/src/icons/svg/folder.svg
  45. 1
      vueJs/src/icons/svg/global-setting.svg
  46. 1
      vueJs/src/icons/svg/group.svg
  47. 124
      vueJs/src/icons/svg/identity-server.svg
  48. 1
      vueJs/src/icons/svg/identity.svg
  49. 1
      vueJs/src/icons/svg/organization-unit.svg
  50. 1
      vueJs/src/icons/svg/route.svg
  51. 1
      vueJs/src/icons/svg/tenant.svg
  52. 10
      vueJs/src/lang/zh.ts
  53. 1
      vueJs/src/permission.ts
  54. 6
      vueJs/src/router/modules/admin.ts
  55. 6
      vueJs/src/router/modules/apigateway.ts
  56. 8
      vueJs/src/router/modules/file-management.ts
  57. 8
      vueJs/src/router/modules/identityServer.ts
  58. 4
      vueJs/src/store/index.ts
  59. 27
      vueJs/src/store/modules/abp.ts
  60. 4
      vueJs/src/store/modules/permission.ts
  61. 13
      vueJs/src/store/modules/user.ts
  62. 39
      vueJs/src/utils/request.ts
  63. 4
      vueJs/src/views/admin/settings/components/SettingEditForm.vue
  64. 7
      vueJs/src/views/admin/settings/index.vue
  65. 249
      vueJs/src/views/file-management/index.vue
  66. 6
      vueJs/src/views/login/index.vue
  67. 4
      vueJs/src/views/register/index.vue
  68. 4
      vueJs/src/views/reset-password/index.vue

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
-- ---------------------------- -- ----------------------------

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

@ -4,6 +4,7 @@ using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileManagement namespace LINGYUN.Abp.FileManagement
{ {
[DependsOn( [DependsOn(
typeof(AbpFileManagementDomainSharedModule),
typeof(AbpDddApplicationModule))] typeof(AbpDddApplicationModule))]
public class AbpFileManagementApplicationContractsModule : AbpModule public class AbpFileManagementApplicationContractsModule : AbpModule
{ {

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

@ -4,7 +4,6 @@ namespace LINGYUN.Abp.FileManagement
{ {
public class FileCopyOrMoveDto public class FileCopyOrMoveDto
{ {
[Required]
[StringLength(255)] [StringLength(255)]
public string Path { get; set; } public string Path { get; set; }

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

@ -8,7 +8,6 @@ namespace LINGYUN.Abp.FileManagement
/// <summary> /// <summary>
/// 文件名 /// 文件名
/// </summary> /// </summary>
[Required]
[StringLength(255)] [StringLength(255)]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>

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

@ -4,7 +4,6 @@ namespace LINGYUN.Abp.FileManagement
{ {
public class FileDeleteDto public class FileDeleteDto
{ {
[Required]
[StringLength(255)] [StringLength(255)]
public string Path { get; set; } public string Path { 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; }
}
}

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

@ -4,7 +4,6 @@ namespace LINGYUN.Abp.FileManagement
{ {
public class FileSystemGetDto public class FileSystemGetDto
{ {
[Required]
[StringLength(255)] [StringLength(255)]
public string Path { get; set; } public string Path { get; set; }

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

@ -2,7 +2,7 @@
{ {
public class AbpFileManagementPermissions public class AbpFileManagementPermissions
{ {
public const string GroupName = "Abp.FileManagement"; public const string GroupName = "AbpFileManagement";
/// <summary> /// <summary>
/// 文件系统 /// 文件系统

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

@ -126,7 +126,8 @@ namespace LINGYUN.Abp.FileManagement
var fileSystemPath = GetFileSystemPath(input.Path); var fileSystemPath = GetFileSystemPath(input.Path);
fileSystemPath = Path.Combine(fileSystemPath, input.Name); fileSystemPath = Path.Combine(fileSystemPath, input.Name);
var blobName = GetFileSystemRelativePath(fileSystemPath); var blobName = GetFileSystemRelativePath(fileSystemPath);
// 去除第一个路径标识符
blobName = blobName.RemovePreFix("/", "\\");
return await BlobContainer.GetAsync(blobName); return await BlobContainer.GetAsync(blobName);
} }
@ -181,10 +182,14 @@ namespace LINGYUN.Abp.FileManagement
fileSystemPath = GetFileSystemPath(input.Parent); fileSystemPath = GetFileSystemPath(input.Parent);
} }
var directoryInfo = new DirectoryInfo(fileSystemPath); var directoryInfo = new DirectoryInfo(fileSystemPath);
// 查询全部 if (!directoryInfo.Exists)
{
return Task.FromResult(new PagedResultDto<FileSystemDto>(0, fileSystems));
}
// 查询全部文件系统
var fileSystemInfos = directoryInfo.GetFileSystemInfos(); var fileSystemInfos = directoryInfo.GetFileSystemInfos();
// 指定搜索条件查询目录 // 指定搜索条件查询目录
FileSystemInfo[] fileSystemInfoSearchChildren;// = directoryInfo.GetDirectories(input.Filter ?? "*", SearchOption.TopDirectoryOnly); FileSystemInfo[] fileSystemInfoSearchChildren;
if (!input.Filter.IsNullOrWhiteSpace()) if (!input.Filter.IsNullOrWhiteSpace())
{ {
var searchPattern = $"*{input.Filter}*"; var searchPattern = $"*{input.Filter}*";
@ -341,20 +346,22 @@ namespace LINGYUN.Abp.FileManagement
// 去除完整路径中的文件系统根目录 // 去除完整路径中的文件系统根目录
var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration(); var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration();
var blobPath = fileSystemConfiguration.BasePath; var blobPath = fileSystemConfiguration.BasePath;
path = path.Replace(blobPath, "");
// 去除租户或宿主目录 // 去除租户或宿主目录
if (CurrentTenant.Id == null) if (CurrentTenant.Id == null)
{ {
path = path.Replace("\\host", ""); blobPath = Path.Combine(blobPath, "host");
} }
else else
{ {
path = path.Replace($"\\tenants\\{CurrentTenant.Id.Value.ToString("D")}", ""); blobPath = Path.Combine(blobPath, "tenants", CurrentTenant.Id.Value.ToString("D"));
} }
// 去除完整路径中的容器根目录 // 去除完整路径中的容器根目录
var containerName = BlobContainerNameAttribute.GetContainerName<FileSystemContainer>(); var containerName = BlobContainerNameAttribute.GetContainerName<FileSystemContainer>();
path = path.Replace($"\\{containerName}", ""); if (path.Contains(containerName))
{
blobPath = Path.Combine(blobPath, containerName);
}
path = path.Replace(blobPath, "");
return path; return path;
} }
@ -363,8 +370,10 @@ namespace LINGYUN.Abp.FileManagement
var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration(); var fileSystemConfiguration = GetFileSystemBlobProviderConfiguration();
var blobPath = GetFileSystemBashPath(); var blobPath = GetFileSystemBashPath();
if (fileSystemConfiguration.AppendContainerNameToBasePath) if (!path.IsNullOrWhiteSpace() && fileSystemConfiguration.AppendContainerNameToBasePath)
{ {
// 去除第一个路径标识符
path = path.RemovePreFix("/", "\\");
blobPath = Path.Combine(blobPath, path); blobPath = Path.Combine(blobPath, path);
} }

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

@ -1,4 +1,5 @@
using LINGYUN.Abp.FileManagement.Settings; using LINGYUN.Abp.FileManagement.Settings;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.StaticFiles;
using System; using System;
@ -47,7 +48,7 @@ namespace LINGYUN.Abp.FileManagement
[HttpPost] [HttpPost]
[Route("files")] [Route("files")]
public virtual async Task CreateFileAsync(FileCreateDto input) public virtual async Task CreateFileAsync([FromQuery] FileCreateDto input, IFormFile file)
{ {
// 检查文件大小 // 检查文件大小
var fileSizeLimited = await SettingProvider var fileSizeLimited = await SettingProvider
@ -76,17 +77,15 @@ namespace LINGYUN.Abp.FileManagement
{ {
throw new UserFriendlyException(L["NotAllowedFileExtensionName", fileExtensionName]); throw new UserFriendlyException(L["NotAllowedFileExtensionName", fileExtensionName]);
} }
// 当前计算机临时目录
var tempFilePath = Environment.GetFolderPath(Environment.SpecialFolder.Templates);
// 以上传的文件名创建一个临时目录 // 以上传的文件名创建一个临时目录
tempFilePath = Path.Combine(tempFilePath, "lingyun-abp-file-management", Path.GetFileNameWithoutExtension(fileName)); 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}"); var tempSavedFile = Path.Combine(tempFilePath, $"{input.CurrentByte}.{fileExtensionName}");
if (!Directory.Exists(tempFilePath))
{
// 临时目录不存在则创建
Directory.CreateDirectory(tempFilePath);
}
try try
{ {
if (HttpContext.RequestAborted.IsCancellationRequested) if (HttpContext.RequestAborted.IsCancellationRequested)
@ -99,7 +98,7 @@ namespace LINGYUN.Abp.FileManagement
using (var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write)) using (var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write))
{ {
// 写入当前分片文件 // 写入当前分片文件
await Request.Body.CopyToAsync(fs); await file.CopyToAsync(fs);
} }
if (input.CurrentByte == input.TotalByte) if (input.CurrentByte == input.TotalByte)
@ -160,46 +159,66 @@ namespace LINGYUN.Abp.FileManagement
[HttpGet] [HttpGet]
[Route("files")] [Route("files")]
public virtual async Task DownloadFileAsync(FileSystemGetDto input) public virtual async Task<IActionResult> DownloadFileAsync(FileSystemDownloadDto input)
{ {
var fileStream = await FileSystemAppService.DownloadFileAsync(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 fileExt = Path.GetExtension(input.Name);
var provider = new FileExtensionContentTypeProvider(); var provider = new FileExtensionContentTypeProvider();
// Http响应标头的文件类型 // Http响应标头的文件类型
string memi = provider.Mappings[fileExt]; string memi = provider.Mappings[fileExt];
using (Response.Body)
{
// Http响应标头的文件类型
Response.ContentType = memi;
// 文件大小 // 文件大小
byte[] contentBytes = await fileStream.GetAllBytesAsync(); contentLength = fileStream.Length;
long contentLength = contentBytes.Length; if (bufferSize > contentLength)
// 指定响应内容大小 {
Response.ContentLength = contentLength; var currentTransferBytes = await fileStream.GetAllBytesAsync();
// 单个分块大小 2MB // 写入响应流
int bufferSize = 2 * 1024 * 1024; return File(currentTransferBytes, memi, input.Name);
// 分块总数 }
int contentByteCount = Math.DivRem(contentBytes.Length, bufferSize, out int modResult); else
for (int index = 0; index < contentByteCount; index++)
{ {
// 当前分页传输字节 // 当前分页传输字节
byte[] currentTransferBytes = new byte[bufferSize]; byte[] currentTransferBytes = new byte[bufferSize];
if (index == contentByteCount - 1) if (input.CurrentByte + bufferSize >= contentLength)
{ {
// 最后一个分块和余数大小一起传输 currentTransferBytes = new byte[contentLength - input.CurrentByte];
if (modResult > 0)
{
currentTransferBytes = new byte[bufferSize + modResult];
}
} }
// 复制文件流中的当前分块区段 // 读取文件流中的当前分块区段
Array.Copy(contentBytes, index * bufferSize, currentTransferBytes, 0, currentTransferBytes.Length); fileStream.Seek(input.CurrentByte, SeekOrigin.Begin);
await fileStream.ReadAsync(currentTransferBytes, 0, currentTransferBytes.Length);
// 写入响应流 // 写入响应流
await Response.Body.WriteAsync(currentTransferBytes, 0, currentTransferBytes.Length); return File(currentTransferBytes, memi, input.Name);
// 清空缓冲区
await Response.Body.FlushAsync();
} }
} }
} }

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

@ -198,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")

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

@ -165,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")

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>

13
vueJs/src/api/filemanagement.ts

@ -73,6 +73,19 @@ export default class FileManagementService {
const _url = baseUrl + '/files/copy' const _url = baseUrl + '/files/copy'
return ApiService.Put<void>(_url, payload, serviceUrl) 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 { export enum FileSystemType {

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

10
vueJs/src/lang/zh.ts

@ -614,7 +614,8 @@ export default {
confirm: '确 定', confirm: '确 定',
correctEmailAddress: '正确的邮件地址', correctEmailAddress: '正确的邮件地址',
correctPhoneNumber: '正确的手机号码', correctPhoneNumber: '正确的手机号码',
operatingFast: '您的操作过快,请稍后再试!' operatingFast: '您的操作过快,请稍后再试!',
request404: '您所请求的资源不存在!'
}, },
messages: { messages: {
noNotifications: '没有通知', noNotifications: '没有通知',
@ -626,8 +627,13 @@ export default {
lastModificationTime: '修改时间', lastModificationTime: '修改时间',
type: '类型', type: '类型',
folder: '文件夹', folder: '文件夹',
file: '文件',
fileType: '{exten}文件', fileType: '{exten}文件',
size: '大小', size: '大小',
root: '根目录' 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'

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']
} }
} }

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

@ -6,8 +6,8 @@ const fileManagementRouter: RouteConfig = {
component: Layout, component: Layout,
meta: { meta: {
title: 'filemanagement', title: 'filemanagement',
icon: 'manager', icon: 'file-manager',
roles: ['Abp.FileManagement.FileSystem'], roles: ['AbpFileManagement.FileSystem'],
alwaysShow: true alwaysShow: true
}, },
children: [ children: [
@ -17,8 +17,8 @@ const fileManagementRouter: RouteConfig = {
name: 'filesystem', name: 'filesystem',
meta: { meta: {
title: 'filesystem', title: 'filesystem',
icon: 'file-system', icon: 'file-storage',
roles: ['Abp.FileManagement.FileSystem'] roles: ['AbpFileManagement.FileSystem']
} }
} }
] ]

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 ''
} }

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

@ -1,6 +1,13 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="filter-container"> <div class="filter-container">
<el-page-header
@back="handleGoToLastFolder"
>
<template
slot="content"
class="file-system-page"
>
<el-breadcrumb <el-breadcrumb
ref="fileSystemBreadCrumb" ref="fileSystemBreadCrumb"
separator-class="el-icon-arrow-right" separator-class="el-icon-arrow-right"
@ -9,11 +16,13 @@
v-for="(fileRoot, index) in fileSystemRoot" v-for="(fileRoot, index) in fileSystemRoot"
:key="index" :key="index"
class="file-system-breadcrumb" class="file-system-breadcrumb"
@click.native="handleBreadCrumbClick" @click.native="(event) => handleBreadCrumbClick(event, index)"
> >
{{ fileRoot }} {{ fileRoot }}
</el-breadcrumb-item> </el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</template>
</el-page-header>
</div> </div>
<el-table <el-table
@ -25,22 +34,28 @@
fit fit
highlight-current-row highlight-current-row
style="width: 100%;" style="width: 100%;"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChanged"
@row-click="handleRowClick" @row-click="handleRowClick"
@row-dblclick="handleRowDoubleClick" @row-dblclick="handleRowDoubleClick"
> >
<el-table-column <el-table-column
type="selection" type="selection"
width="50px" width="50"
align="center" align="center"
/> />
<el-table-column <el-table-column
:label="$t('fileSystem.name')" :label="$t('fileSystem.name')"
prop="name" prop="name"
sortable sortable
width="150px" width="350"
align="center" align="left"
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
<svg-icon
:name="row.type | fileSystemTypeIconFilter"
:class="row.type | fileSystemTypeIconClassFilter"
/>
<span>{{ row.name }}</span> <span>{{ row.name }}</span>
</template> </template>
</el-table-column> </el-table-column>
@ -48,7 +63,7 @@
:label="$t('fileSystem.creationTime')" :label="$t('fileSystem.creationTime')"
prop="creationTime" prop="creationTime"
sortable sortable
width="150px" width="200"
align="center" align="center"
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
@ -59,7 +74,7 @@
:label="$t('fileSystem.lastModificationTime')" :label="$t('fileSystem.lastModificationTime')"
prop="lastModificationTime" prop="lastModificationTime"
sortable sortable
width="150px" width="200"
align="center" align="center"
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
@ -70,7 +85,7 @@
:label="$t('fileSystem.type')" :label="$t('fileSystem.type')"
prop="type" prop="type"
sortable sortable
width="150px" width="150"
align="center" align="center"
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
@ -81,13 +96,59 @@
:label="$t('fileSystem.size')" :label="$t('fileSystem.size')"
prop="size" prop="size"
sortable sortable
width="150px" width="200"
align="center" align="center"
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
<span>{{ row.size | fileSystemSizeFilter }}</span> <span>{{ row.size | fileSystemSizeFilter }}</span>
</template> </template>
</el-table-column> </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> </el-table>
<Pagination <Pagination
@ -102,6 +163,7 @@
<script lang="ts"> <script lang="ts">
import { dateFormat } from '@/utils' import { dateFormat } from '@/utils'
import { checkPermission } from '@/utils/permission'
import { Component, Vue } from 'vue-property-decorator' import { Component, Vue } from 'vue-property-decorator'
import Pagination from '@/components/Pagination/index.vue' import Pagination from '@/components/Pagination/index.vue'
import FileSystemService, { FileSystem, FileSystemGetByPaged, FileSystemType } from '@/api/filemanagement' import FileSystemService, { FileSystem, FileSystemGetByPaged, FileSystemType } from '@/api/filemanagement'
@ -120,6 +182,18 @@ const gbUnit = mbUnit * 1024
const date = new Date(datetime) const date = new Date(datetime)
return dateFormat(date, 'YYYY-mm-dd HH:MM') 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) { fileSystemTypeFilter(type: FileSystemType) {
if (type === FileSystemType.Folder) { if (type === FileSystemType.Folder) {
return 'fileSystem.folder' return 'fileSystem.folder'
@ -147,9 +221,19 @@ const gbUnit = mbUnit * 1024
} }
return kb + ' KB' return kb + ' KB'
} }
},
methods: {
checkPermission,
tableRowClassName(row: any) {
if (row.row.type === 0) {
return 'folder-row'
}
return 'file-row'
}
} }
}) })
export default class extends Vue { export default class extends Vue {
private downloading!: boolean
private lastFilePath!: string private lastFilePath!: string
private fileSystemRoot!: string[] private fileSystemRoot!: string[]
private fileSystemList?: FileSystem[] private fileSystemList?: FileSystem[]
@ -161,6 +245,7 @@ export default class extends Vue {
super() super()
this.lastFilePath = '' this.lastFilePath = ''
this.fileSystemCount = 0 this.fileSystemCount = 0
this.downloading = false
this.fileSystemListLoading = false this.fileSystemListLoading = false
this.fileSystemRoot = new Array<string>() this.fileSystemRoot = new Array<string>()
this.fileSystemList = new Array<FileSystem>() this.fileSystemList = new Array<FileSystem>()
@ -168,7 +253,6 @@ export default class extends Vue {
} }
mounted() { mounted() {
console.log(this.$route.params)
this.fileSystemRoot.push(this.$t('fileSystem.root').toString()) this.fileSystemRoot.push(this.$t('fileSystem.root').toString())
this.handleGetFileSystemList() this.handleGetFileSystemList()
} }
@ -183,10 +267,13 @@ export default class extends Vue {
}) })
} }
private handleRowClick(row: any) { private handleSelectionChanged(selection: any, row: any) {
console.log(row) console.log(row)
}
private handleRowClick(row: any) {
const table = this.$refs.fileSystemTable as any const table = this.$refs.fileSystemTable as any
table.setCurrentRow(row) table.toggleRowSelection(row)
} }
private handleRowDoubleClick(row: any) { private handleRowDoubleClick(row: any) {
@ -196,25 +283,155 @@ export default class extends Vue {
} }
} }
private handleBreadCrumbClick(event: any) { private handleBreadCrumbClick(event: any, index: number) {
const nodeIndex = this.fileSystemRoot.findIndex(f => f === event.target.textContent) // ,
this.fileSystemRoot.splice(nodeIndex) if ((index + 1) < this.fileSystemRoot.length) {
this.fileSystemRoot.splice(index + 1)
this.navigationToFilePath() this.navigationToFilePath()
} }
}
private navigationToFilePath() { private navigationToFilePath() {
const fileSystemPathArray = this.fileSystemRoot.slice(1) const fileSystemPathArray = this.fileSystemRoot.slice(1)
const fileSystemPath = fileSystemPathArray.join('\\') const fileSystemPath = fileSystemPathArray.join('/')
console.log(fileSystemPath)
this.fileSystemGetFilter.parent = fileSystemPath this.fileSystemGetFilter.parent = fileSystemPath
this.handleGetFileSystemList() 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> </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"> <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 { .file-system-breadcrumb .el-breadcrumb__inner {
color: rgb(34, 34, 173); color: rgb(34, 34, 173);
cursor: pointer; 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> </style>

6
vueJs/src/views/login/index.vue

@ -158,7 +158,7 @@ import TenantBox from '@/components/TenantBox/index.vue'
import LangSelect from '@/components/LangSelect/index.vue' import LangSelect from '@/components/LangSelect/index.vue'
import { Component, Vue, Watch } from 'vue-property-decorator' import { Component, Vue, Watch } from 'vue-property-decorator'
import UserService, { PhoneVerify, VerifyType } from '@/api/users' import UserService, { PhoneVerify, VerifyType } from '@/api/users'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
@Component({ @Component({
name: 'Login', name: 'Login',
@ -185,11 +185,11 @@ export default class extends Vue {
} }
get isMultiEnabled() { get isMultiEnabled() {
return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled return AbpModule.configuration?.multiTenancy?.isEnabled
} }
get selfRegistration() { get selfRegistration() {
const selfRegister = AbpConfigurationModule.configuration.setting.values['Abp.Account.IsSelfRegistrationEnabled'] const selfRegister = AbpModule.configuration.setting.values['Abp.Account.IsSelfRegistrationEnabled']
if (selfRegister) { if (selfRegister) {
return selfRegister === 'true' return selfRegister === 'true'
} }

4
vueJs/src/views/register/index.vue

@ -125,7 +125,7 @@ import TenantBox from '@/components/TenantBox/index.vue'
import LangSelect from '@/components/LangSelect/index.vue' import LangSelect from '@/components/LangSelect/index.vue'
import { Component, Vue, Watch } from 'vue-property-decorator' import { Component, Vue, Watch } from 'vue-property-decorator'
import UserService, { PhoneVerify, VerifyType, UserRegisterData } from '@/api/users' import UserService, { PhoneVerify, VerifyType, UserRegisterData } from '@/api/users'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
@Component({ @Component({
name: 'Register', name: 'Register',
@ -151,7 +151,7 @@ export default class extends Vue {
} }
get isMultiEnabled() { get isMultiEnabled() {
return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled return AbpModule.configuration?.multiTenancy?.isEnabled
} }
private validatePhoneNumberValue = (rule: any, value: string, callback: any) => { private validatePhoneNumberValue = (rule: any, value: string, callback: any) => {

4
vueJs/src/views/reset-password/index.vue

@ -113,7 +113,7 @@ import TenantBox from '@/components/TenantBox/index.vue'
import LangSelect from '@/components/LangSelect/index.vue' import LangSelect from '@/components/LangSelect/index.vue'
import { Component, Vue, Watch } from 'vue-property-decorator' import { Component, Vue, Watch } from 'vue-property-decorator'
import UserService, { PhoneVerify, VerifyType, UserResetPasswordData } from '@/api/users' import UserService, { PhoneVerify, VerifyType, UserResetPasswordData } from '@/api/users'
import { AbpConfigurationModule } from '@/store/modules/abp' import { AbpModule } from '@/store/modules/abp'
@Component({ @Component({
name: 'Register', name: 'Register',
@ -138,7 +138,7 @@ export default class extends Vue {
} }
get isMultiEnabled() { get isMultiEnabled() {
return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled return AbpModule.configuration?.multiTenancy?.isEnabled
} }
private validatePhoneNumberValue = (rule: any, value: string, callback: any) => { private validatePhoneNumberValue = (rule: any, value: string, callback: any) => {

Loading…
Cancel
Save