Browse Source

Merge pull request #105 from colinin/3.2

backlog commits
pull/177/head
cKey 5 years ago
committed by GitHub
parent
commit
22951cbd02
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      aspnet-core/LINGYUN.MicroService.sln
  2. 31
      aspnet-core/database/ApiGateway-Init-SqlServer.sql
  3. 60
      aspnet-core/database/ApiGateway-Init.sql
  4. 9
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/AbpAccountWebModule.cs
  5. 35
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/LINGYUN.Abp.Account.Web.csproj
  6. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Pages/_ViewImports.cshtml
  7. 27
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Properties/launchSettings.json
  8. 14
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/README.md
  9. 71
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/css/site.css
  10. BIN
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/favicon.ico
  11. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/js/site.js
  12. 22
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/LICENSE
  13. 3719
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css
  14. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map
  15. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css
  16. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map
  17. 331
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css
  18. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map
  19. 8
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css
  20. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map
  21. 10038
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css
  22. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
  23. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
  24. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
  25. 7013
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js
  26. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map
  27. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js
  28. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map
  29. 4435
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js
  30. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map
  31. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
  32. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map
  33. 12
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
  34. 432
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
  35. 5
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
  36. 22
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/LICENSE.md
  37. 1158
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/additional-methods.js
  38. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
  39. 1601
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/jquery.validate.js
  40. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
  41. 36
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/LICENSE.txt
  42. 10872
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.js
  43. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.min.js
  44. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.min.map
  45. 12
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimDto.cs
  46. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateDto.cs
  47. 22
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateOrUpdateBaseDto.cs
  48. 23
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeDto.cs
  49. 9
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeGetByPagedDto.cs
  50. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeUpdateDto.cs
  51. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimCreateDto.cs
  52. 6
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimDeleteDto.cs
  53. 13
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimUpdateDto.cs
  54. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimCreateDto.cs
  55. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimDeleteDto.cs
  56. 13
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimUpdateDto.cs
  57. 18
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityClaimTypeAppService.cs
  58. 16
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityRoleAppService.cs
  59. 19
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityUserAppService.cs
  60. 8
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityErrorCodes.cs
  61. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissionDefinitionProvider.cs
  62. 10
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissions.cs
  63. 25
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/en.json
  64. 25
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/zh-Hans.json
  65. 8
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/AbpIdentityApplicationModuleAutoMapperProfile.cs
  66. 129
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityClaimTypeAppService.cs
  67. 64
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityRoleAppService.cs
  68. 62
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityUserAppService.cs
  69. 38
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityRoleController.cs
  70. 38
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityUserController.cs
  71. 63
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityClaimTypeController.cs
  72. 74
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityRoleController.cs
  73. 74
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityUserController.cs
  74. 60
      aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs
  75. 3
      aspnet-core/services/account/AuthServer.Host/AuthServer.Host.csproj
  76. 18
      aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs
  77. 10
      aspnet-core/services/account/AuthServer.Host/EntityFrameworkCore/AuthServerHostMigrationsDbContextFactory.cs
  78. 6
      aspnet-core/services/account/AuthServer.Host/Pages/Index.cshtml
  79. 2
      aspnet-core/services/account/AuthServer.Host/Pages/Index.cshtml.cs
  80. 16
      aspnet-core/services/account/AuthServer.Host/Program.cs
  81. 2
      aspnet-core/services/account/AuthServer.Host/Properties/launchSettings.json
  82. 4
      aspnet-core/services/account/AuthServer.Host/package.json
  83. 46
      aspnet-core/services/account/AuthServer.Host/wwwroot/libs/abp/luxon/abp.luxon.js
  84. BIN
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db
  85. 93
      vueJs/src/api/cliam-type.ts
  86. 24
      vueJs/src/api/types.ts
  87. 37
      vueJs/src/api/users.ts
  88. 12
      vueJs/src/icons/components/claim-type.ts
  89. 1
      vueJs/src/icons/components/index.ts
  90. 1
      vueJs/src/icons/svg/claim-type.svg
  91. 3
      vueJs/src/lang/en.ts
  92. 5
      vueJs/src/lang/zh.ts
  93. 10
      vueJs/src/router/modules/admin.ts
  94. 230
      vueJs/src/views/admin/claim-type/components/CreateOrUpdateCliamTypeForm.vue
  95. 252
      vueJs/src/views/admin/claim-type/index.vue
  96. 124
      vueJs/src/views/admin/identityServer/client/components/ClientClaimEditForm.vue
  97. 297
      vueJs/src/views/admin/users/components/UserClaimCreateOrUpdateForm.vue
  98. 30
      vueJs/src/views/admin/users/index.vue

7
aspnet-core/LINGYUN.MicroService.sln

@ -249,6 +249,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManag
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.Identity", "modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj", "{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Account.Web", "modules\account\LINGYUN.Abp.Account.Web\LINGYUN.Abp.Account.Web.csproj", "{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -659,6 +661,10 @@ Global
{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.Build.0 = Release|Any CPU
{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -784,6 +790,7 @@ Global
{CC362C67-6FC1-42B3-A130-8120AA8D790C} = {C5CAD011-DF84-4914-939C-0C029DCEF26F}
{B46D6DAF-98C6-441F-9FA5-3CAD7CF27727} = {CC362C67-6FC1-42B3-A130-8120AA8D790C}
{2D377D3A-70EC-4BB3-9F4C-6C933693DA98} = {52B5D4F7-237B-4E0A-A167-68442164F70A}
{5F43141B-6C63-4547-B9D6-D69EC3D7CA7E} = {9E72FEB9-A626-4312-892B-CDD043879758}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}

31
aspnet-core/database/ApiGateway-Init-SqlServer.sql

File diff suppressed because one or more lines are too long

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

@ -1,5 +1,5 @@
/*
Navicat Premium Data Transfer
Navicat MySQL Data Transfer
Source Server :
Source Server Type : MySQL
@ -11,7 +11,7 @@
Target Server Version : 80020
File Encoding : 65001
Date: 28/09/2020 20:41:21
Date: 15/10/2020 21:36:21
*/
SET NAMES utf8mb4;
@ -90,7 +90,7 @@ CREATE TABLE `appapigatewayauthoptions` (
PRIMARY KEY (`Id`) 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
) ENGINE = InnoDB AUTO_INCREMENT = 132 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 136 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewayauthoptions
@ -195,6 +195,10 @@ INSERT INTO `appapigatewayauthoptions` VALUES (128, 1310460417141817344, '', '')
INSERT INTO `appapigatewayauthoptions` VALUES (129, 1310502391475519488, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (130, 1310515546943569920, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (131, 1310515735292985344, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (132, 1316628769783480320, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (133, 1316628940663619584, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (134, 1316629112428756992, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (135, 1316652047017246720, '', '');
-- ----------------------------
-- Table structure for appapigatewaybalanceroptions
@ -212,7 +216,7 @@ CREATE TABLE `appapigatewaybalanceroptions` (
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_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 135 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewaybalanceroptions
@ -318,6 +322,10 @@ INSERT INTO `appapigatewaybalanceroptions` VALUES (131, NULL, 131046041714181734
INSERT INTO `appapigatewaybalanceroptions` VALUES (132, NULL, 1310502391475519488, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (133, NULL, 1310515546943569920, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (134, NULL, 1310515735292985344, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (135, NULL, 1316628769783480320, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (136, NULL, 1316628940663619584, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (137, NULL, 1316629112428756992, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (138, NULL, 1316652047017246720, '', '', 0);
-- ----------------------------
-- Table structure for appapigatewaycacheoptions
@ -331,7 +339,7 @@ CREATE TABLE `appapigatewaycacheoptions` (
PRIMARY KEY (`Id`) 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
) ENGINE = InnoDB AUTO_INCREMENT = 132 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 136 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewaycacheoptions
@ -436,6 +444,10 @@ INSERT INTO `appapigatewaycacheoptions` VALUES (128, 1310460417141817344, 0, '')
INSERT INTO `appapigatewaycacheoptions` VALUES (129, 1310502391475519488, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (130, 1310515546943569920, NULL, NULL);
INSERT INTO `appapigatewaycacheoptions` VALUES (131, 1310515735292985344, NULL, NULL);
INSERT INTO `appapigatewaycacheoptions` VALUES (132, 1316628769783480320, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (133, 1316628940663619584, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (134, 1316629112428756992, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (135, 1316652047017246720, 0, '');
-- ----------------------------
-- Table structure for appapigatewaydiscovery
@ -545,7 +557,7 @@ CREATE TABLE `appapigatewayhttpoptions` (
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_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 135 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewayhttpoptions
@ -651,6 +663,10 @@ INSERT INTO `appapigatewayhttpoptions` VALUES (131, NULL, 1310460417141817344, 0
INSERT INTO `appapigatewayhttpoptions` VALUES (132, NULL, 1310502391475519488, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (133, NULL, 1310515546943569920, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (134, NULL, 1310515735292985344, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (135, NULL, 1316628769783480320, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (136, NULL, 1316628940663619584, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (137, NULL, 1316629112428756992, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (138, NULL, 1316652047017246720, 0, 0, 0, 0, 0);
-- ----------------------------
-- Table structure for appapigatewayqosoptions
@ -668,7 +684,7 @@ CREATE TABLE `appapigatewayqosoptions` (
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_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 135 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewayqosoptions
@ -774,6 +790,10 @@ INSERT INTO `appapigatewayqosoptions` VALUES (131, NULL, 1310460417141817344, 50
INSERT INTO `appapigatewayqosoptions` VALUES (132, NULL, 1310502391475519488, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (133, NULL, 1310515546943569920, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (134, NULL, 1310515735292985344, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (135, NULL, 1316628769783480320, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (136, NULL, 1316628940663619584, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (137, NULL, 1316629112428756992, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (138, NULL, 1316652047017246720, 50, 60000, 30000);
-- ----------------------------
-- Table structure for appapigatewayratelimitoptions
@ -815,7 +835,7 @@ CREATE TABLE `appapigatewayratelimitrule` (
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_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 132 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 136 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewayratelimitrule
@ -920,6 +940,10 @@ INSERT INTO `appapigatewayratelimitrule` VALUES (128, 1310460417141817344, NULL,
INSERT INTO `appapigatewayratelimitrule` VALUES (129, 1310502391475519488, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (130, 1310515546943569920, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (131, 1310515735292985344, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (132, 1316628769783480320, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (133, 1316628940663619584, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (134, 1316629112428756992, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (135, 1316652047017246720, NULL, '', 0, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for appapigatewayreroute
@ -959,7 +983,7 @@ CREATE TABLE `appapigatewayreroute` (
PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `AK_AppApiGatewayReRoute_ReRouteId`(`ReRouteId`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayReRoute_AppId_DownstreamPathTemplate_UpstreamPa~`(`AppId`, `DownstreamPathTemplate`, `UpstreamPathTemplate`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 143 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewayreroute
@ -1064,6 +1088,10 @@ INSERT INTO `appapigatewayreroute` VALUES (135, '{}', '2ecfe7483bc94c28ad0769b65
INSERT INTO `appapigatewayreroute` VALUES (136, '{}', '744e340c0024462d88458b7ea9605b3c', 1310502391475519488, '【后台服务】- 安全日志列表', '/api/auditing/security-log', '', '', '/api/auditing/security-log', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (137, '{}', 'a99639f4172547c4ba9b4f4ca5cb4ab9', 1310515546943569920, '【后台服务】- 安全日志', '/api/auditing/security-log/{id}', '', '', '/api/auditing/security-log/{id}', 'DELETE,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (138, '{}', 'c3ebc82d55f640fb9d70a911e97e4ec1', 1310515735292985344, '【后台管理】- 审计日志', '/api/auditing/audit-log/{id}', '', '', '/api/auditing/audit-log/{id}', 'DELETE,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30010,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (139, '{}', '0379fcb3a9cd4b13b562b3b5b5c3eb7d', 1316628769783480320, '【身份认证服务】- 声明类型', '/api/identity/claim-types', '', '', '/api/identity/claim-types', 'GET,POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (140, '{}', 'de25c9a80d994f728b37eb483b2f5127', 1316628940663619584, '【身份认证服务】- 管理声明类型', '/api/identity/claim-types/{id}', '', '', '/api/identity/claim-types/{id}', 'GET,PUT,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (141, '{}', '25c19106baff4cf3a877ae8cd690a1b5', 1316629112428756992, '【身份认证服务】- 查询在用的声明类型列表', '/api/identity/claim-types/actived-list', '', '', '/api/identity/claim-types/actived-list', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (142, '{}', 'd42f8b779cf344eeaa24df0ae37fb7cf', 1316652047017246720, '【身份认证服务】- 管理用户声明', '/api/identity/users/claims/{id}', '', '', '/api/identity/users/claims/{id}', 'POST,PUT,DELETE,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
-- ----------------------------
-- Table structure for appapigatewayroutegroup
@ -1107,7 +1135,7 @@ CREATE TABLE `appapigatewaysecurityoptions` (
PRIMARY KEY (`Id`) 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
) ENGINE = InnoDB AUTO_INCREMENT = 132 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 136 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of appapigatewaysecurityoptions
@ -1212,6 +1240,10 @@ INSERT INTO `appapigatewaysecurityoptions` VALUES (128, 1310460417141817344, '',
INSERT INTO `appapigatewaysecurityoptions` VALUES (129, 1310502391475519488, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (130, 1310515546943569920, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (131, 1310515735292985344, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (132, 1316628769783480320, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (133, 1316628940663619584, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (134, 1316629112428756992, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (135, 1316652047017246720, '', '');
-- ----------------------------
-- Table structure for cap.published
@ -1230,6 +1262,14 @@ CREATE TABLE `cap.published` (
INDEX `IX_ExpiresAt`(`ExpiresAt`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cap.published
-- ----------------------------
INSERT INTO `cap.published` VALUES (1316628771217932288, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-callback-name\":null,\"cap-msg-id\":\"1316628771217932288\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2020/10/15 14:35:35 +08:00\",\"cap-corr-id\":\"1316628771217932288\",\"cap-corr-seq\":\"0\"},\"Value\":{\"DateTime\":\"2020-10-15T14:35:35.4925577+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2020-10-15 14:35:36', '2020-10-16 14:35:36', 'Succeeded');
INSERT INTO `cap.published` VALUES (1316628940789448704, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-callback-name\":null,\"cap-msg-id\":\"1316628940789448704\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2020/10/15 14:36:15 +08:00\",\"cap-corr-id\":\"1316628940789448704\",\"cap-corr-seq\":\"0\"},\"Value\":{\"DateTime\":\"2020-10-15T14:36:15.9244062+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2020-10-15 14:36:16', '2020-10-16 14:36:16', 'Succeeded');
INSERT INTO `cap.published` VALUES (1316629112500060160, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-callback-name\":null,\"cap-msg-id\":\"1316629112500060160\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2020/10/15 14:36:56 +08:00\",\"cap-corr-id\":\"1316629112500060160\",\"cap-corr-seq\":\"0\"},\"Value\":{\"DateTime\":\"2020-10-15T14:36:56.8629946+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2020-10-15 14:36:57', '2020-10-16 14:36:57', 'Succeeded');
INSERT INTO `cap.published` VALUES (1316652047117910016, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-callback-name\":null,\"cap-msg-id\":\"1316652047117910016\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2020/10/15 16:08:04 +08:00\",\"cap-corr-id\":\"1316652047117910016\",\"cap-corr-seq\":\"0\"},\"Value\":{\"DateTime\":\"2020-10-15T16:08:04.901902+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2020-10-15 16:08:05', '2020-10-16 16:08:05', 'Succeeded');
-- ----------------------------
-- Table structure for cap.received
-- ----------------------------

9
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/AbpAccountWebModule.cs

@ -0,0 +1,9 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Account.Web
{
[DependsOn(typeof(Volo.Abp.Account.Web.AbpAccountWebModule))]
public class AbpAccountWebModule : AbpModule
{
}
}

35
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/LINGYUN.Abp.Account.Web.csproj

@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>LINGYUN.Abp.Account.Web</AssemblyName>
<PackageId>LINGYUN.Abp.Account.Web</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<RootNamespace>LINGYUN.Abp.Account.Web</RootNamespace>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Pages\**\*.js" />
<EmbeddedResource Include="Pages\**\*.css" />
<Content Remove="Pages\**\*.js" />
<Content Remove="Pages\**\*.css" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Account.Web" Version="3.2.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.6" />
</ItemGroup>
<ItemGroup>
<Folder Include="Pages\Account\" />
</ItemGroup>
</Project>

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Pages/_ViewImports.cshtml

@ -0,0 +1,4 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling

27
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:63675",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"LINGYUN.Abp.Account.Web": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

14
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/README.md

@ -0,0 +1,14 @@
# LINGYUN.Abp.Account.Web
重写用户账户相关页面
## 配置使用
```csharp
[DependsOn(typeof(LINGYUN.Abp.Account.Web.AbpAccountWebModule))]
public class YouProjectModule : AbpModule
{
// other
}
```

71
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/css/site.css

@ -0,0 +1,71 @@
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
/* Provide sufficient contrast against white background */
a {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
font-size: 14px;
}
@media (min-width: 768px) {
html {
font-size: 16px;
}
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px; /* Vertically center the text there */
}

BIN
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/js/site.js

@ -0,0 +1,4 @@
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.
// Write your Javascript code.

22
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/LICENSE

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

3719
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css

File diff suppressed because it is too large

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map

File diff suppressed because one or more lines are too long

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css

File diff suppressed because one or more lines are too long

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map

File diff suppressed because one or more lines are too long

331
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css

@ -0,0 +1,331 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg {
overflow: hidden;
vertical-align: middle;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map

File diff suppressed because one or more lines are too long

8
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map

File diff suppressed because one or more lines are too long

10038
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css

File diff suppressed because it is too large

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map

File diff suppressed because one or more lines are too long

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css

File diff suppressed because one or more lines are too long

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map

File diff suppressed because one or more lines are too long

7013
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js

File diff suppressed because it is too large

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map

File diff suppressed because one or more lines are too long

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js

File diff suppressed because one or more lines are too long

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map

File diff suppressed because one or more lines are too long

4435
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js

File diff suppressed because it is too large

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map

File diff suppressed because one or more lines are too long

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js

File diff suppressed because one or more lines are too long

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map

File diff suppressed because one or more lines are too long

12
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt

@ -0,0 +1,12 @@
Copyright (c) .NET Foundation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
these files except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

432
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js

@ -0,0 +1,432 @@
// Unobtrusive validation support library for jQuery and jQuery Validate
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// @version v3.2.11
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like environments that support module.exports
module.exports = factory(require('jquery-validation'));
} else {
// Browser global
jQuery.validator.unobtrusive = factory(jQuery);
}
}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
function setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if (options.message) {
options.messages[ruleName] = options.message;
}
}
function splitAndTrim(value) {
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
}
function escapeAttributeValue(value) {
// As mentioned on http://api.jquery.com/category/selectors/
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
}
function getModelPrefix(fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
}
function appendModelPrefix(value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
function onErrors(event, validator) { // 'this' is the form element
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer");
if (container) {
var replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container.empty();
}
}
}
function onReset(event) { // 'this' is the form element
var $form = $(this),
key = '__jquery_unobtrusive_validation_form_reset';
if ($form.data(key)) {
return;
}
// Set a flag that indicates we're currently resetting the form.
$form.data(key, true);
try {
$form.data("validator").resetForm();
} finally {
$form.removeData(key);
}
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
}
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
};
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement: function (element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var $element = $(element),
form = $element.parents("form")[0],
valInfo, rules, messages;
if (!form) { // Cannot do client-side validation without a form
return;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
message = $element.attr(prefix),
paramValues = {};
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
prefix += "-";
$.each(this.params, function () {
paramValues[this] = $element.attr(prefix + this);
});
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
$.extend(rules, { "__dummy__": true });
if (!skipAttach) {
valInfo.attachValidation();
}
},
parse: function (selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
.addBack()
.filter("form")
.add($selector.find("form"))
.has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add = function (adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if (!fn) { // Called with no params, just a function
fn = params;
params = [];
}
this.push({ name: adapterName, params: params, adapt: fn });
return this;
};
adapters.addBool = function (adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, function (options) {
setValidationValues(options, ruleName || adapterName, true);
});
};
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
var min = options.params.min,
max = options.params.max;
if (min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else if (min) {
setValidationValues(options, minRuleName, min);
}
else if (max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [attribute || "val"], function (options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod("__dummy__", function (value, element, params) {
return true;
});
$jQval.addMethod("regex", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
var match;
if (nonalphamin) {
match = value.match(/\W/g);
match = match && match.length >= nonalphamin;
}
return match;
});
if ($jQval.methods.extension) {
adapters.addSingleVal("accept", "mimtype");
adapters.addSingleVal("extension", "extension");
} else {
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
// validating the extension, and ignore mime-type validations as they are not supported.
adapters.addSingleVal("extension", "extension", "accept");
}
adapters.addSingleVal("regex", "pattern");
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
setValidationValues(options, "equalTo", element);
});
adapters.add("required", function (options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
setValidationValues(options, "required", true);
}
});
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] = function () {
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
// For checkboxes and radio buttons, only pick up values from checked fields.
if (field.is(":checkbox")) {
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
}
else if (field.is(":radio")) {
return field.filter(":checked").val() || '';
}
return field.val();
};
});
setValidationValues(options, "remote", value);
});
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
if (options.params.min) {
setValidationValues(options, "minlength", options.params.min);
}
if (options.params.nonalphamin) {
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
}
if (options.params.regex) {
setValidationValues(options, "regex", options.params.regex);
}
});
adapters.add("fileextensions", ["extensions"], function (options) {
setValidationValues(options, "extension", options.params.extensions);
});
$(function () {
$jQval.unobtrusive.parse(document);
});
return $jQval.unobtrusive;
}));

5
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js

File diff suppressed because one or more lines are too long

22
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/LICENSE.md

@ -0,0 +1,22 @@
The MIT License (MIT)
=====================
Copyright Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

1158
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/additional-methods.js

File diff suppressed because it is too large

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/additional-methods.min.js

File diff suppressed because one or more lines are too long

1601
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/jquery.validate.js

File diff suppressed because it is too large

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js

File diff suppressed because one or more lines are too long

36
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/LICENSE.txt

@ -0,0 +1,36 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

10872
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.js

File diff suppressed because it is too large

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.min.js

File diff suppressed because one or more lines are too long

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/wwwroot/lib/jquery/dist/jquery.min.map

File diff suppressed because one or more lines are too long

12
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimDto.cs

@ -0,0 +1,12 @@
using System;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimDto : EntityDto<Guid>
{
public string ClaimType { get; set; }
public string ClaimValue { get; set; }
}
}

17
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateDto.cs

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Identity;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimTypeCreateDto : IdentityClaimTypeCreateOrUpdateBaseDto
{
[Required]
[DynamicStringLength(typeof(IdentityClaimTypeConsts), nameof(IdentityClaimTypeConsts.MaxNameLength))]
public string Name { get; set; }
public bool IsStatic { get; set; }
public IdentityClaimValueType ValueType { get; set; }
}
}

22
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateOrUpdateBaseDto.cs

@ -0,0 +1,22 @@
using Volo.Abp.Identity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimTypeCreateOrUpdateBaseDto : ExtensibleObject
{
public bool Required { get; set; }
[DynamicStringLength(typeof(IdentityClaimTypeConsts), nameof(IdentityClaimTypeConsts.MaxRegexLength))]
public string Regex { get; set; }
[DynamicStringLength(typeof(IdentityClaimTypeConsts), nameof(IdentityClaimTypeConsts.MaxRegexDescriptionLength))]
public string RegexDescription { get; set; }
[DynamicStringLength(typeof(IdentityClaimTypeConsts), nameof(IdentityClaimTypeConsts.MaxDescriptionLength))]
public string Description { get; set; }
}
}

23
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeDto.cs

@ -0,0 +1,23 @@
using System;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimTypeDto : ExtensibleEntityDto<Guid>
{
public string Name { get; set; }
public bool Required { get; set; }
public bool IsStatic { get; set; }
public string Regex { get; set; }
public string RegexDescription { get; set; }
public string Description { get; set; }
public IdentityClaimValueType ValueType { get; set; }
}
}

9
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeGetByPagedDto.cs

@ -0,0 +1,9 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimTypeGetByPagedDto : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

7
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeUpdateDto.cs

@ -0,0 +1,7 @@
namespace LINGYUN.Abp.Identity
{
public class IdentityClaimTypeUpdateDto : IdentityClaimTypeCreateOrUpdateBaseDto
{
}
}

17
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimCreateDto.cs

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Identity;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityRoleClaimCreateDto
{
[Required]
[DynamicMaxLength(typeof(IdentityRoleClaimConsts), nameof(IdentityRoleClaimConsts.MaxClaimTypeLength))]
public string ClaimType { get; set; }
[Required]
[DynamicMaxLength(typeof(IdentityRoleClaimConsts), nameof(IdentityRoleClaimConsts.MaxClaimValueLength))]
public string ClaimValue { get; set; }
}
}

6
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimDeleteDto.cs

@ -0,0 +1,6 @@
namespace LINGYUN.Abp.Identity
{
public class IdentityRoleClaimDeleteDto : IdentityRoleClaimCreateDto
{
}
}

13
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimUpdateDto.cs

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Identity;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityRoleClaimUpdateDto : IdentityRoleClaimCreateDto
{
[Required]
[DynamicMaxLength(typeof(IdentityRoleClaimConsts), nameof(IdentityRoleClaimConsts.MaxClaimValueLength))]
public string NewClaimValue { get; set; }
}
}

17
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimCreateDto.cs

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Identity;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityUserClaimCreateDto
{
[Required]
[DynamicMaxLength(typeof(IdentityUserClaimConsts), nameof(IdentityUserClaimConsts.MaxClaimTypeLength))]
public string ClaimType { get; set; }
[Required]
[DynamicMaxLength(typeof(IdentityUserClaimConsts), nameof(IdentityUserClaimConsts.MaxClaimValueLength))]
public string ClaimValue { get; set; }
}
}

7
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimDeleteDto.cs

@ -0,0 +1,7 @@
namespace LINGYUN.Abp.Identity
{
public class IdentityUserClaimDeleteDto : IdentityUserClaimCreateDto
{
}
}

13
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimUpdateDto.cs

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Identity;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.Identity
{
public class IdentityUserClaimUpdateDto : IdentityUserClaimCreateDto
{
[Required]
[DynamicMaxLength(typeof(IdentityUserClaimConsts), nameof(IdentityUserClaimConsts.MaxClaimValueLength))]
public string NewClaimValue { get; set; }
}
}

18
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityClaimTypeAppService.cs

@ -0,0 +1,18 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.Identity
{
public interface IIdentityClaimTypeAppService :
ICrudAppService<
IdentityClaimTypeDto,
Guid,
IdentityClaimTypeGetByPagedDto,
IdentityClaimTypeCreateDto,
IdentityClaimTypeUpdateDto>
{
Task<ListResultDto<IdentityClaimTypeDto>> GetAllListAsync();
}
}

16
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityRoleAppService.cs

@ -7,7 +7,23 @@ namespace LINGYUN.Abp.Identity
{
public interface IIdentityRoleAppService : IApplicationService
{
#region OrganizationUnit
Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id);
Task SetOrganizationUnitsAsync(Guid id, IdentityRoleAddOrRemoveOrganizationUnitDto input);
#endregion
#region ClaimType
Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id);
Task AddClaimAsync(Guid id, IdentityRoleClaimCreateDto input);
Task UpdateClaimAsync(Guid id, IdentityRoleClaimUpdateDto input);
Task DeleteClaimAsync(Guid id, IdentityRoleClaimDeleteDto input);
#endregion
}
}

19
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityUserAppService.cs

@ -7,7 +7,26 @@ namespace LINGYUN.Abp.Identity
{
public interface IIdentityUserAppService : IApplicationService
{
#region OrganizationUnit
Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id);
Task UpdateOrganizationUnitsAsync(Guid id, IdentityUserOrganizationUnitUpdateDto input);
#endregion
#region ClaimType
Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id);
Task AddClaimAsync(Guid id, IdentityUserClaimCreateDto input);
Task UpdateClaimAsync(Guid id, IdentityUserClaimUpdateDto input);
Task DeleteClaimAsync(Guid id, IdentityUserClaimDeleteDto input);
#endregion
}
}

8
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityErrorCodes.cs

@ -0,0 +1,8 @@
namespace LINGYUN.Abp.Identity
{
public class IdentityErrorCodes
{
public const string StaticClaimTypeChange = "Volo.Abp.Identity:020005";
public const string StaticClaimTypeDeletion = "Volo.Abp.Identity:020006";
}
}

7
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissionDefinitionProvider.cs

@ -14,12 +14,14 @@ namespace LINGYUN.Abp.Identity
var userPermission = identityGroup.GetPermissionOrNull(Volo.Abp.Identity.IdentityPermissions.Users.Default);
if (userPermission != null)
{
userPermission.AddChild(IdentityPermissions.Users.ManageClaims, L("Permission:ManageClaims"));
userPermission.AddChild(IdentityPermissions.Users.ManageOrganizationUnits, L("Permission:ManageOrganizationUnits"));
}
var rolePermission = identityGroup.GetPermissionOrNull(Volo.Abp.Identity.IdentityPermissions.Roles.Default);
if (rolePermission != null)
{
rolePermission.AddChild(IdentityPermissions.Roles.ManageClaims, L("Permission:ManageClaims"));
rolePermission.AddChild(IdentityPermissions.Roles.ManageOrganizationUnits, L("Permission:ManageOrganizationUnits"));
}
@ -29,6 +31,11 @@ namespace LINGYUN.Abp.Identity
origanizationUnitPermission.AddChild(IdentityPermissions.OrganizationUnits.Delete, L("Permission:Delete"));
origanizationUnitPermission.AddChild(IdentityPermissions.OrganizationUnits.ManageRoles, L("Permission:ChangeRoles"));
origanizationUnitPermission.AddChild(IdentityPermissions.OrganizationUnits.ManageUsers, L("Permission:ChangeUsers"));
var identityClaimType = identityGroup.AddPermission(IdentityPermissions.IdentityClaimType.Default, L("Permission:IdentityClaimTypeManagement"));
identityClaimType.AddChild(IdentityPermissions.IdentityClaimType.Create, L("Permission:Create"));
identityClaimType.AddChild(IdentityPermissions.IdentityClaimType.Update, L("Permission:Edit"));
identityClaimType.AddChild(IdentityPermissions.IdentityClaimType.Delete, L("Permission:Delete"));
}
}

10
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissions.cs

@ -6,11 +6,13 @@ namespace LINGYUN.Abp.Identity
{
public static class Roles
{
public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageClaims";
public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageOrganizationUnits";
}
public static class Users
{
public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageClaims";
public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageOrganizationUnits";
}
@ -24,6 +26,14 @@ namespace LINGYUN.Abp.Identity
public const string ManageRoles = Default + ".ManageRoles";
}
public static class IdentityClaimType
{
public const string Default = Volo.Abp.Identity.IdentityPermissions.GroupName + ".IdentityClaimTypes";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static string[] GetAll()
{
return ReflectionHelper.GetPublicConstantsRecursively(typeof(IdentityPermissions));

25
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/en.json

@ -4,6 +4,29 @@
"Permission:OrganizationUnitManagement": "Organization unit management",
"Permission:ChangeRoles": "Change roles",
"Permission:ChangeUsers": "Change users",
"Permission:ManageOrganizationUnits": "Management organization units"
"Permission:ManageClaims": "Management claims",
"Permission:ManageOrganizationUnits": "Management organization units",
"Permission:IdentityClaimTypeManagement": "Management claim types",
"IdentityClaimTypeAlreadyExists": "The identity claim type {0} already exists!",
"UserClaimAlreadyExists": "User claim with the same parameters have been added!",
"RoleClaimAlreadyExists": "Role claim with the same parameters has been added!",
"DisplayName:ClaimType": "Type",
"DisplayName:ClaimValue": "Value",
"ClaimSubject": "Claim - {0}",
"AddClaim": "Add claim",
"UpdateClaim": "Update claim",
"DeleteClaim": "Delete claim",
"WillDeleteClaim": "Pending deletion claim type: {0}",
"ManageClaim": "Management claim",
"IdentityClaim:New": "New claim",
"IdentityClaim:Name": "Name",
"IdentityClaim:Required": "Required",
"IdentityClaim:IsStatic": "Is static",
"IdentityClaim:Regex": "Regex",
"IdentityClaim:RegexDescription": "Regex description",
"IdentityClaim:Description": "Description",
"IdentityClaim:ValueType": "Value type",
"Volo.Abp.Identity:020005": "The static claim type cannot be changed!",
"Volo.Abp.Identity:020006": "Unable to delete static claim type!"
}
}

25
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/zh-Hans.json

@ -4,6 +4,29 @@
"Permission:OrganizationUnitManagement": "组织机构管理",
"Permission:ChangeRoles": "更改角色",
"Permission:ChangeUsers": "更改用户",
"Permission:ManageOrganizationUnits": "管理组织机构"
"Permission:ManageClaims": "管理声明",
"Permission:ManageOrganizationUnits": "管理组织机构",
"Permission:IdentityClaimTypeManagement": "管理声明类型",
"IdentityClaimTypeAlreadyExists": "声明类型 {0} 已经存在!",
"UserClaimAlreadyExists": "已经添加相同参数的用户声明!",
"RoleClaimAlreadyExists": "已经添加相同参数的角色声明",
"DisplayName:ClaimType": "声明类型",
"DisplayName:ClaimValue": "声明值",
"ClaimSubject": "声明 - {0}",
"AddClaim": "添加声明",
"UpdateClaim": "变更声明",
"DeleteClaim": "删除声明",
"WillDeleteClaim": "声明类型: {0} 将被删除",
"ManageClaim": "管理声明",
"IdentityClaim:New": "新声明类型",
"IdentityClaim:Name": "名称",
"IdentityClaim:Required": "是否必须",
"IdentityClaim:IsStatic": "是否静态",
"IdentityClaim:Regex": "正则",
"IdentityClaim:RegexDescription": "正则描述",
"IdentityClaim:Description": "描述",
"IdentityClaim:ValueType": "值类型",
"Volo.Abp.Identity:020005": "无法变更静态声明类型!",
"Volo.Abp.Identity:020006": "无法删除静态声明类型!"
}
}

8
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/AbpIdentityApplicationModuleAutoMapperProfile.cs

@ -1,7 +1,4 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Text;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
@ -10,6 +7,11 @@ namespace LINGYUN.Abp.Identity
{
public AbpIdentityApplicationModuleAutoMapperProfile()
{
CreateMap<IdentityClaimType, IdentityClaimTypeDto>()
.MapExtraProperties();
CreateMap<IdentityUserClaim, IdentityClaimDto>();
CreateMap<IdentityRoleClaim, IdentityClaimDto>();
CreateMap<IdentityUser, IdentityUserDto>()
.MapExtraProperties();

129
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityClaimTypeAppService.cs

@ -0,0 +1,129 @@
using Microsoft.AspNetCore.Authorization;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[Authorize(IdentityPermissions.IdentityClaimType.Default)]
public class IdentityClaimTypeAppService : IdentityAppServiceBase, IIdentityClaimTypeAppService
{
protected IdenityClaimTypeManager IdenityClaimTypeManager { get; }
protected IIdentityClaimTypeRepository IdentityClaimTypeRepository { get; }
public IdentityClaimTypeAppService(
IdenityClaimTypeManager idenityClaimTypeManager,
IIdentityClaimTypeRepository identityClaimTypeRepository)
{
IdenityClaimTypeManager = idenityClaimTypeManager;
IdentityClaimTypeRepository = identityClaimTypeRepository;
}
[Authorize(IdentityPermissions.IdentityClaimType.Create)]
public virtual async Task<IdentityClaimTypeDto> CreateAsync(IdentityClaimTypeCreateDto input)
{
if (await IdentityClaimTypeRepository.AnyAsync(input.Name))
{
throw new UserFriendlyException(L["IdentityClaimTypeAlreadyExists", input.Name]);
}
var identityClaimType = new IdentityClaimType(
GuidGenerator.Create(),
input.Name,
input.Required,
input.IsStatic,
input.Regex,
input.RegexDescription,
input.Description,
input.ValueType
);
identityClaimType = await IdenityClaimTypeManager.CreateAsync(identityClaimType);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<IdentityClaimType, IdentityClaimTypeDto>(identityClaimType);
}
[Authorize(IdentityPermissions.IdentityClaimType.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
var identityClaimType = await IdentityClaimTypeRepository.FindAsync(id);
if (identityClaimType == null)
{
return;
}
CheckDeletionClaimType(identityClaimType);
await IdentityClaimTypeRepository.DeleteAsync(identityClaimType);
}
public virtual async Task<IdentityClaimTypeDto> GetAsync(Guid id)
{
var identityClaimType = await IdentityClaimTypeRepository.FindAsync(id);
return ObjectMapper.Map<IdentityClaimType, IdentityClaimTypeDto>(identityClaimType);
}
public virtual async Task<ListResultDto<IdentityClaimTypeDto>> GetAllListAsync()
{
var identityClaimTypes = await IdentityClaimTypeRepository
.GetListAsync();
return new ListResultDto<IdentityClaimTypeDto>(
ObjectMapper.Map<List<IdentityClaimType>, List<IdentityClaimTypeDto>>(identityClaimTypes));
}
public virtual async Task<PagedResultDto<IdentityClaimTypeDto>> GetListAsync(IdentityClaimTypeGetByPagedDto input)
{
var identityClaimTypeCount = await IdentityClaimTypeRepository.GetCountAsync(input.Filter);
var identityClaimTypes = await IdentityClaimTypeRepository
.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter);
return new PagedResultDto<IdentityClaimTypeDto>(identityClaimTypeCount,
ObjectMapper.Map<List<IdentityClaimType>, List<IdentityClaimTypeDto>>(identityClaimTypes));
}
[Authorize(IdentityPermissions.IdentityClaimType.Update)]
public virtual async Task<IdentityClaimTypeDto> UpdateAsync(Guid id, IdentityClaimTypeUpdateDto input)
{
var identityClaimType = await IdentityClaimTypeRepository.GetAsync(id);
CheckChangingClaimType(identityClaimType);
identityClaimType.Required = input.Required;
if (!string.Equals(identityClaimType.Regex, input.Regex, StringComparison.InvariantCultureIgnoreCase))
{
identityClaimType.Regex = input.Regex;
}
if (!string.Equals(identityClaimType.RegexDescription, input.RegexDescription, StringComparison.InvariantCultureIgnoreCase))
{
identityClaimType.RegexDescription = input.RegexDescription;
}
if (!string.Equals(identityClaimType.Description, input.Description, StringComparison.InvariantCultureIgnoreCase))
{
identityClaimType.Description = input.Description;
}
identityClaimType = await IdenityClaimTypeManager.UpdateAsync(identityClaimType);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<IdentityClaimType, IdentityClaimTypeDto>(identityClaimType);
}
protected virtual void CheckChangingClaimType(IdentityClaimType claimType)
{
if (claimType.IsStatic)
{
throw new BusinessException(IdentityErrorCodes.StaticClaimTypeChange);
}
}
protected virtual void CheckDeletionClaimType(IdentityClaimType claimType)
{
if (claimType.IsStatic)
{
throw new BusinessException(IdentityErrorCodes.StaticClaimTypeDeletion);
}
}
}
}

64
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityRoleAppService.cs

@ -2,13 +2,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[Authorize(IdentityPermissions.Roles.ManageOrganizationUnits)]
[Authorize(Volo.Abp.Identity.IdentityPermissions.Roles.Default)]
public class IdentityRoleAppService : IdentityAppServiceBase, IIdentityRoleAppService
{
protected IIdentityRoleRepository IdentityRoleRepository { get; }
@ -22,6 +24,9 @@ namespace LINGYUN.Abp.Identity
IdentityRoleRepository = roleRepository;
}
#region OrganizationUnit
[Authorize(IdentityPermissions.Roles.ManageOrganizationUnits)]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
var origanizationUnits = await IdentityRoleRepository.GetOrganizationUnitsAsync(id);
@ -30,6 +35,7 @@ namespace LINGYUN.Abp.Identity
ObjectMapper.Map<List<OrganizationUnit>, List<OrganizationUnitDto>>(origanizationUnits));
}
[Authorize(IdentityPermissions.Roles.ManageOrganizationUnits)]
public virtual async Task SetOrganizationUnitsAsync(Guid id, IdentityRoleAddOrRemoveOrganizationUnitDto input)
{
var origanizationUnits = await IdentityRoleRepository.GetOrganizationUnitsAsync(id, true);
@ -49,5 +55,61 @@ namespace LINGYUN.Abp.Identity
await CurrentUnitOfWork.SaveChangesAsync();
}
#endregion
#region ClaimType
public virtual async Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id)
{
var role = await IdentityRoleRepository.GetAsync(id);
return new ListResultDto<IdentityClaimDto>(ObjectMapper.Map<ICollection<IdentityRoleClaim>, List<IdentityClaimDto>>(role.Claims));
}
[Authorize(IdentityPermissions.Roles.ManageClaims)]
public virtual async Task AddClaimAsync(Guid id, IdentityRoleClaimCreateDto input)
{
var role = await IdentityRoleRepository.GetAsync(id);
var claim = new Claim(input.ClaimType, input.ClaimValue);
if (role.FindClaim(claim) != null)
{
throw new UserFriendlyException(L["RoleClaimAlreadyExists"]);
}
role.AddClaim(GuidGenerator, claim);
await IdentityRoleRepository.UpdateAsync(role);
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(IdentityPermissions.Roles.ManageClaims)]
public virtual async Task UpdateClaimAsync(Guid id, IdentityRoleClaimUpdateDto input)
{
var role = await IdentityRoleRepository.GetAsync(id);
var oldClaim = role.FindClaim(new Claim(input.ClaimType, input.ClaimValue));
if (oldClaim != null)
{
role.RemoveClaim(oldClaim.ToClaim());
role.AddClaim(GuidGenerator, new Claim(input.ClaimType, input.NewClaimValue));
await IdentityRoleRepository.UpdateAsync(role);
await CurrentUnitOfWork.SaveChangesAsync();
}
}
[Authorize(IdentityPermissions.Roles.ManageClaims)]
public virtual async Task DeleteClaimAsync(Guid id, IdentityRoleClaimDeleteDto input)
{
var role = await IdentityRoleRepository.GetAsync(id);
role.RemoveClaim(new Claim(input.ClaimType, input.ClaimValue));
await IdentityRoleRepository.UpdateAsync(role);
await CurrentUnitOfWork.SaveChangesAsync();
}
#endregion
}
}

62
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityUserAppService.cs

@ -1,13 +1,17 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[Authorize(IdentityPermissions.Users.ManageOrganizationUnits)]
[Authorize(Volo.Abp.Identity.IdentityPermissions.Users.Default)]
public class IdentityUserAppService : IdentityAppServiceBase, IIdentityUserAppService
{
protected IdentityUserManager UserManager { get; }
@ -17,16 +21,20 @@ namespace LINGYUN.Abp.Identity
UserManager = userManager;
}
#region OrganizationUnit
[Authorize(IdentityPermissions.Users.ManageOrganizationUnits)]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
var user = await UserManager.GetByIdAsync(id);
var origanizationUnits = await UserManager.GetOrganizationUnitsAsync(user);
var origanizationUnits = await UserManager.GetOrganizationUnitsAsync(user);
return new ListResultDto<OrganizationUnitDto>(
ObjectMapper.Map<List<OrganizationUnit>, List<OrganizationUnitDto>>(origanizationUnits));
}
[Authorize(IdentityPermissions.Users.ManageOrganizationUnits)]
public virtual async Task UpdateOrganizationUnitsAsync(Guid id, IdentityUserOrganizationUnitUpdateDto input)
{
var user = await UserManager.GetByIdAsync(id);
@ -35,5 +43,55 @@ namespace LINGYUN.Abp.Identity
await CurrentUnitOfWork.SaveChangesAsync();
}
#endregion
#region Claim
public virtual async Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id)
{
var user = await UserManager.GetByIdAsync(id);
return new ListResultDto<IdentityClaimDto>(ObjectMapper.Map<ICollection<IdentityUserClaim>, List<IdentityClaimDto>>(user.Claims));
}
[Authorize(IdentityPermissions.Users.ManageClaims)]
public virtual async Task AddClaimAsync(Guid id, IdentityUserClaimCreateDto input)
{
var user = await UserManager.GetByIdAsync(id);
var claim = new Claim(input.ClaimType, input.ClaimValue);
if (user.FindClaim(claim) != null)
{
throw new UserFriendlyException(L["UserClaimAlreadyExists"]);
}
user.AddClaim(GuidGenerator, claim);
(await UserManager.UpdateAsync(user)).CheckErrors();
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(IdentityPermissions.Users.ManageClaims)]
public virtual async Task UpdateClaimAsync(Guid id, IdentityUserClaimUpdateDto input)
{
var user = await UserManager.GetByIdAsync(id);
var oldClaim = new Claim(input.ClaimType, input.ClaimValue);
var newClaim = new Claim(input.ClaimType, input.NewClaimValue);
user.ReplaceClaim(oldClaim, newClaim);
(await UserManager.UpdateAsync(user)).CheckErrors();
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(IdentityPermissions.Users.ManageClaims)]
public virtual async Task DeleteClaimAsync(Guid id, IdentityUserClaimDeleteDto input)
{
var user = await UserManager.GetByIdAsync(id);
user.RemoveClaim(new Claim(input.ClaimType, input.ClaimValue));
(await UserManager.UpdateAsync(user)).CheckErrors();
await CurrentUnitOfWork.SaveChangesAsync();
}
#endregion
}
}

38
aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityRoleController.cs

@ -1,38 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[RemoteService(true, Name = IdentityRemoteServiceConsts.RemoteServiceName)]
[Area("identity")]
[ControllerName("Role")]
[Route("api/identity/roles")]
public class IIdentityRoleController : AbpController, IIdentityRoleAppService
{
protected IIdentityRoleAppService RoleAppService { get; }
public IIdentityRoleController(
IIdentityRoleAppService roleAppService)
{
RoleAppService = roleAppService;
}
[HttpGet]
[Route("organization-units/{id}")]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
return await RoleAppService.GetOrganizationUnitsAsync(id);
}
[HttpPut]
[Route("organization-units/{id}")]
public virtual async Task SetOrganizationUnitsAsync(Guid id, IdentityRoleAddOrRemoveOrganizationUnitDto input)
{
await RoleAppService.SetOrganizationUnitsAsync(id, input);
}
}
}

38
aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityUserController.cs

@ -1,38 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[RemoteService(true, Name = IdentityRemoteServiceConsts.RemoteServiceName)]
[Area("identity")]
[ControllerName("User")]
[Route("api/identity/users")]
public class IIdentityUserController : AbpController, IIdentityUserAppService
{
protected IIdentityUserAppService UserAppService { get; }
public IIdentityUserController(
IIdentityUserAppService userAppService)
{
UserAppService = userAppService;
}
[HttpGet]
[Route("organization-units/{id}")]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
return await UserAppService.GetOrganizationUnitsAsync(id);
}
[HttpPut]
[Route("organization-units/{id}")]
public virtual async Task UpdateOrganizationUnitsAsync(Guid id, IdentityUserOrganizationUnitUpdateDto input)
{
await UserAppService.UpdateOrganizationUnitsAsync(id, input);
}
}
}

63
aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityClaimTypeController.cs

@ -0,0 +1,63 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[RemoteService(true, Name = IdentityRemoteServiceConsts.RemoteServiceName)]
[Area("identity")]
[ControllerName("ClaimType")]
[Route("api/identity/claim-types")]
public class IdentityClaimTypeController : AbpController, IIdentityClaimTypeAppService
{
protected IIdentityClaimTypeAppService IdentityClaimTypeAppService { get; }
public IdentityClaimTypeController(IIdentityClaimTypeAppService identityClaimTypeAppService)
{
IdentityClaimTypeAppService = identityClaimTypeAppService;
}
[HttpPost]
public virtual async Task<IdentityClaimTypeDto> CreateAsync(IdentityClaimTypeCreateDto input)
{
return await IdentityClaimTypeAppService.CreateAsync(input);
}
[HttpDelete]
[Route("{id}")]
public virtual async Task DeleteAsync(Guid id)
{
await IdentityClaimTypeAppService.DeleteAsync(id);
}
[HttpGet]
[Route("actived-list")]
public virtual async Task<ListResultDto<IdentityClaimTypeDto>> GetAllListAsync()
{
return await IdentityClaimTypeAppService.GetAllListAsync();
}
[HttpGet]
[Route("{id}")]
public virtual async Task<IdentityClaimTypeDto> GetAsync(Guid id)
{
return await IdentityClaimTypeAppService.GetAsync(id);
}
[HttpGet]
public virtual async Task<PagedResultDto<IdentityClaimTypeDto>> GetListAsync(IdentityClaimTypeGetByPagedDto input)
{
return await IdentityClaimTypeAppService.GetListAsync(input);
}
[HttpPut]
[Route("{id}")]
public virtual async Task<IdentityClaimTypeDto> UpdateAsync(Guid id, IdentityClaimTypeUpdateDto input)
{
return await IdentityClaimTypeAppService.UpdateAsync(id, input);
}
}
}

74
aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityRoleController.cs

@ -0,0 +1,74 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[RemoteService(true, Name = IdentityRemoteServiceConsts.RemoteServiceName)]
[Area("identity")]
[ControllerName("Role")]
[Route("api/identity/roles")]
public class IdentityRoleController : AbpController, IIdentityRoleAppService
{
protected IIdentityRoleAppService RoleAppService { get; }
public IdentityRoleController(
IIdentityRoleAppService roleAppService)
{
RoleAppService = roleAppService;
}
#region OrganizationUnit
[HttpGet]
[Route("organization-units/{id}")]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
return await RoleAppService.GetOrganizationUnitsAsync(id);
}
[HttpPut]
[Route("organization-units/{id}")]
public virtual async Task SetOrganizationUnitsAsync(Guid id, IdentityRoleAddOrRemoveOrganizationUnitDto input)
{
await RoleAppService.SetOrganizationUnitsAsync(id, input);
}
#endregion
#region Claim
[HttpGet]
[Route("claims/{id}")]
public virtual async Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id)
{
return await RoleAppService.GetClaimsAsync(id);
}
[HttpPost]
[Route("claims/{id}")]
public virtual async Task AddClaimAsync(Guid id, IdentityRoleClaimCreateDto input)
{
await RoleAppService.AddClaimAsync(id, input);
}
[HttpPut]
[Route("claims/{id}")]
public virtual async Task UpdateClaimAsync(Guid id, IdentityRoleClaimUpdateDto input)
{
await RoleAppService.UpdateClaimAsync(id, input);
}
[HttpDelete]
[Route("claims/{id}")]
public virtual async Task DeleteClaimAsync(Guid id, IdentityRoleClaimDeleteDto input)
{
await RoleAppService.DeleteClaimAsync(id, input);
}
#endregion
}
}

74
aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityUserController.cs

@ -0,0 +1,74 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Identity
{
[RemoteService(true, Name = IdentityRemoteServiceConsts.RemoteServiceName)]
[Area("identity")]
[ControllerName("User")]
[Route("api/identity/users")]
public class IdentityUserController : AbpController, IIdentityUserAppService
{
protected IIdentityUserAppService UserAppService { get; }
public IdentityUserController(
IIdentityUserAppService userAppService)
{
UserAppService = userAppService;
}
#region OrganizationUnit
[HttpGet]
[Route("organization-units/{id}")]
public virtual async Task<ListResultDto<OrganizationUnitDto>> GetOrganizationUnitsAsync(Guid id)
{
return await UserAppService.GetOrganizationUnitsAsync(id);
}
[HttpPut]
[Route("organization-units/{id}")]
public virtual async Task UpdateOrganizationUnitsAsync(Guid id, IdentityUserOrganizationUnitUpdateDto input)
{
await UserAppService.UpdateOrganizationUnitsAsync(id, input);
}
#endregion
#region Claim
[HttpGet]
[Route("claims/{id}")]
public virtual async Task<ListResultDto<IdentityClaimDto>> GetClaimsAsync(Guid id)
{
return await UserAppService.GetClaimsAsync(id);
}
[HttpPost]
[Route("claims/{id}")]
public virtual async Task AddClaimAsync(Guid id, IdentityUserClaimCreateDto input)
{
await UserAppService.AddClaimAsync(id, input);
}
[HttpPut]
[Route("claims/{id}")]
public virtual async Task UpdateClaimAsync(Guid id, IdentityUserClaimUpdateDto input)
{
await UserAppService.UpdateClaimAsync(id, input);
}
[HttpDelete]
[Route("claims/{id}")]
public virtual async Task DeleteClaimAsync(Guid id, IdentityUserClaimDeleteDto input)
{
await UserAppService.DeleteClaimAsync(id, input);
}
#endregion
}
}

60
aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs

@ -1,8 +1,8 @@
using DotNetCore.CAP;
using IdentityServer4;
using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.IdentityServer;
using LINGYUN.Abp.MultiTenancy.DbFinder;
using LINGYUN.Abp.PermissionManagement.Identity;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.DataProtection;
@ -11,7 +11,6 @@ using Microsoft.Extensions.Caching.StackExchangeRedis;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using StackExchange.Redis;
using System;
using System.Linq;
@ -19,8 +18,11 @@ using System.Text;
using Volo.Abp;
using Volo.Abp.Account;
using Volo.Abp.Account.Web;
using Volo.Abp.AspNetCore.MultiTenancy;
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
using Volo.Abp.Auditing;
using Volo.Abp.Autofac;
using Volo.Abp.Caching;
@ -28,9 +30,11 @@ using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.Identity.AspNetCore;
using Volo.Abp.FeatureManagement.EntityFrameworkCore;
using Volo.Abp.Identity;
using Volo.Abp.Identity.EntityFrameworkCore;
using Volo.Abp.IdentityServer.EntityFrameworkCore;
using Volo.Abp.IdentityServer.Jwt;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
@ -44,23 +48,28 @@ using Volo.Abp.UI.Navigation.Urls;
namespace AuthServer.Host
{
[DependsOn(
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpCAPEventBusModule),
typeof(AbpIdentityAspNetCoreModule),
typeof(AbpDbFinderMultiTenancyModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpIdentityServerSmsValidatorModule),
typeof(AbpIdentityServerWeChatValidatorModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpEntityFrameworkCoreMySQLModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpIdentityServerSmsValidatorModule),
typeof(AbpIdentityServerWeChatValidatorModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule)
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpDbFinderMultiTenancyModule),
typeof(AbpCAPEventBusModule)
)]
public class AuthIdentityServerModule : AbpModule
{
@ -143,7 +152,13 @@ namespace AuthServer.Host
});
// context.Services.AddAuthentication();
context.Services.AddAuthentication().AddCookie("Cookie");
context.Services.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = configuration["AuthServer:ApiName"];
});
Configure<AbpMultiTenancyOptions>(options =>
{
@ -181,15 +196,28 @@ namespace AuthServer.Host
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseVirtualFiles();
app.UseAbpRequestLocalization();
app.UseRouting();
app.UseCors(DefaultCorsPolicyName);
app.UseAuthentication();
app.UseJwtTokenMiddleware();
app.UseAbpClaimsMap();
app.UseMultiTenancy();
app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
app.UseAuditing();

3
aspnet-core/services/account/AuthServer.Host/AuthServer.Host.csproj

@ -23,11 +23,13 @@
<PackageReference Include="Volo.Abp.Account.Application" Version="3.2.0" />
<PackageReference Include="Volo.Abp.Account.Web.IdentityServer" Version="3.2.0" />
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="3.2.0" />
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="3.2.0" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="3.2.0" />
<PackageReference Include="Volo.Abp.Autofac" Version="3.2.0" />
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="3.2.0" />
<PackageReference Include="Volo.Abp.Identity.AspNetCore" Version="3.2.0" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="3.2.0" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" Version="3.2.0" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="3.2.0" />
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="3.2.0" />
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="3.2.0" />
@ -39,6 +41,7 @@
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\..\modules\identityServer\LINGYUN.Abp.IdentityServer.WeChatValidator\LINGYUN.Abp.IdentityServer.WeChatValidator.csproj" />
<ProjectReference Include="..\..\..\modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj" />
<ProjectReference Include="..\..\..\modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj" />
<ProjectReference Include="..\..\..\modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj" />
</ItemGroup>

18
aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs

@ -156,7 +156,8 @@ namespace AuthServer.DataSeeder
new[] { "hybrid" },
commonSecret,
redirectUri: $"{webClientRootUrl}signin-oidc",
postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc"
postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc",
corsOrigins: configurationSection["CorsOrigins"]
);
}
@ -200,7 +201,8 @@ namespace AuthServer.DataSeeder
string secret,
string redirectUri = null,
string postLogoutRedirectUri = null,
IEnumerable<string> permissions = null)
IEnumerable<string> permissions = null,
string corsOrigins = null)
{
var client = await _clientRepository.FindByCliendIdAsync(name);
if (client == null)
@ -263,6 +265,18 @@ namespace AuthServer.DataSeeder
}
}
if (corsOrigins != null)
{
var corsOriginsSplit = corsOrigins.Split(";");
foreach (var corsOrigin in corsOriginsSplit)
{
if (client.FindCorsOrigin(corsOrigin) == null)
{
client.AddCorsOrigin(corsOrigin);
}
}
}
if(permissions != null)
{
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, name, permissions);

10
aspnet-core/services/account/AuthServer.Host/EntityFrameworkCore/AuthServerHostMigrationsDbContextFactory.cs

@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
namespace AuthServer.EntityFrameworkCore
@ -19,9 +20,16 @@ namespace AuthServer.EntityFrameworkCore
private static IConfigurationRoot BuildConfiguration()
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";
var envFile = Path.Combine(Directory.GetCurrentDirectory(), $"appsettings.{env}.json");
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.Development.json", optional: false);
.AddJsonFile("appsettings.json", optional: false);
if (File.Exists(envFile))
{
builder.AddJsonFile($"appsettings.{env}.json", optional: false);
}
return builder.Build();
}

6
aspnet-core/services/account/AuthServer.Host/Pages/Index.cshtml

@ -1,5 +1,5 @@
@page
@using AuthServer.Host.Pages
@using TestApp.Pages
@using Volo.Abp.Users
@model IndexModel
@inject ICurrentUser CurrentUser
@ -9,7 +9,7 @@
<abp-row>
<abp-column size-md="_3" class="text-center">
<i class="fa fa-user d-block" style="font-size: 10em; color: #12b900"></i>
<a abp-button="Primary" href="/Account/Logout">Logout</a>
<a abp-button="Primary" asp-controller="Logout" asp-action="Index" asp-area="Account">Logout</a>
</abp-column>
<abp-column size-md="_9">
<h2>@CurrentUser.UserName</h2>
@ -28,7 +28,7 @@
@if (!CurrentUser.IsAuthenticated)
{
<div class="text-center">
<i class="fa fa-user d-block" style="font-size: 10em; color: #aaa"></i><br /><br />
<i class="fa fa-user d-block" style="font-size: 10em; color: #aaa"></i><br/><br />
<a abp-button="Primary" asp-page="/Account/Login">Login</a>
</div>
}

2
aspnet-core/services/account/AuthServer.Host/Pages/Index.cshtml.cs

@ -1,6 +1,6 @@
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace AuthServer.Host.Pages
namespace TestApp.Pages
{
public class IndexModel : AbpPageModel
{

16
aspnet-core/services/account/AuthServer.Host/Program.cs

@ -1,9 +1,7 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.IO;
namespace AuthServer.Host
{
@ -11,15 +9,6 @@ namespace AuthServer.Host
{
public static int Main(string[] args)
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.{env}.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
try
{
Log.Information("Starting web host.");
@ -39,11 +28,14 @@ namespace AuthServer.Host
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.UseSerilog((ctx, cfg) =>
{
cfg = cfg.ReadFrom.Configuration(ctx.Configuration);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog()
.UseAutofac();
}
}

2
aspnet-core/services/account/AuthServer.Host/Properties/launchSettings.json

@ -11,7 +11,7 @@
"AuthServer.Host": {
"commandName": "Project",
"launchBrowser": false,
"applicationUrl": "https://localhost:44386;http://localhost:44385",
"applicationUrl": "http://localhost:44385",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}

4
aspnet-core/services/account/AuthServer.Host/package.json

@ -1,8 +1,8 @@
{
"version": "1.0.0",
"name": "my-app-identityserver",
"name": "auth-identityserver",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^3.1.2"
"@abp/aspnetcore.mvc.ui.theme.basic": "^3.2.0"
}
}

46
aspnet-core/services/account/AuthServer.Host/wwwroot/libs/abp/luxon/abp.luxon.js

@ -0,0 +1,46 @@
var abp = abp || {};
(function () {
if (!luxon) {
throw "abp/luxon library requires the luxon library included to the page!";
}
/* TIMING *************************************************/
abp.timing = abp.timing || {};
var setObjectValue = function (obj, property, value) {
if (typeof property === "string") {
property = property.split('.');
}
if (property.length > 1) {
var p = property.shift();
setObjectValue(obj[p], property, value);
} else {
obj[property[0]] = value;
}
}
var getObjectValue = function (obj, property) {
return property.split('.').reduce((a, v) => a[v], obj)
}
abp.timing.convertFieldsToIsoDate = function (form, fields) {
for (var field of fields) {
var dateTime = luxon.DateTime
.fromFormat(
getObjectValue(form, field),
abp.localization.currentCulture.dateTimeFormat.shortDatePattern,
{locale: abp.localization.currentCulture.cultureName}
);
if (!dateTime.invalid) {
setObjectValue(form, field, dateTime.toFormat("yyyy-MM-dd HH:mm:ss"))
}
}
return form;
}
})(jQuery);

BIN
aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db

Binary file not shown.

93
vueJs/src/api/cliam-type.ts

@ -0,0 +1,93 @@
import ApiService from './serviceBase'
import { ExtensibleEntity, ExtensibleObject, ListResultDto, PagedAndSortedResultRequestDto, PagedResultDto } from './types'
const IdentityServiceUrl = process.env.VUE_APP_BASE_API
export default class ClaimTypeApiService {
public static createClaimType(payload: IdentityClaimTypeCreate) {
const _url = '/api/identity/claim-types'
return ApiService.Post<IdentityClaimType>(_url, payload, IdentityServiceUrl)
}
public static getActivedClaimTypes() {
const _url = '/api/identity/claim-types/actived-list'
return ApiService.Get<ListResultDto<IdentityClaimType>>(_url, IdentityServiceUrl)
}
public static getClaimTypes(payload: IdentityClaimTypeGetByPaged) {
let _url = '/api/identity/claim-types?'
_url += 'filter=' + payload.filter
_url += '&sorting=' + payload.sorting
_url += '&skipCount=' + payload.skipCount
_url += '&maxResultCount=' + payload.maxResultCount
return ApiService.Get<PagedResultDto<IdentityClaimType>>(_url, IdentityServiceUrl)
}
public static getClaimType(id: string) {
const _url = '/api/identity/claim-types/' + id
return ApiService.Get<IdentityClaimType>(_url, IdentityServiceUrl)
}
public static updateClaimType(id: string, payload: IdentityClaimTypeUpdate) {
const _url = '/api/identity/claim-types/' + id
return ApiService.Put<IdentityClaimType>(_url, payload, IdentityServiceUrl)
}
public static deleteClaimType(id: string) {
const _url = '/api/identity/claim-types/' + id
return ApiService.Delete(_url, IdentityServiceUrl)
}
}
export enum IdentityClaimValueType {
String = 0,
Int = 1,
Boolean = 2,
DateTime = 3
}
export class IdentityClaimType extends ExtensibleEntity<string> {
name!: string
required!: boolean
isStatic!: boolean
regex?: string
regexDescription?: string
description?: string
valueType!: IdentityClaimValueType
}
export class IdentityClaimTypeCreateOrUpdateBase extends ExtensibleObject {
required = false
regex?: string = ''
regexDescription?: string = ''
description?: string = ''
}
export class IdentityClaimTypeCreate extends IdentityClaimTypeCreateOrUpdateBase {
name!: string
isStatic!: boolean
valueType!: IdentityClaimValueType
constructor(
name: string,
isStatic = false,
valueType = IdentityClaimValueType.String
) {
super()
this.name = name
this.isStatic = isStatic
this.valueType = valueType
}
}
export class IdentityClaimTypeUpdate extends IdentityClaimTypeCreateOrUpdateBase {
}
export class IdentityClaimTypeGetByPaged extends PagedAndSortedResultRequestDto {
filter = ''
constructor() {
super()
this.sorting = 'name'
}
}

24
vueJs/src/api/types.ts

@ -126,6 +126,30 @@ export class PagedResultDto<T> implements ListResultDto<T>, IPagedResult<T> {
export class ListResultDto<T> implements IListResult<T> {
items!: T[]
}
export class ExtensibleObject implements IHasExtraProperties {
extraProperties!: {[key: string]: any}
public setProperty(key: string, value: any) {
this.extraProperties[key] = value
}
public getProperty(key: string) {
if (this.extraProperties[key]) {
return this.extraProperties[key]
}
return null
}
}
export class ExtensibleEntity<TKey> extends ExtensibleObject {
id!: TKey
}
export interface IHasExtraProperties {
extraProperties: {[key: string]: any}
}
/** 分页请求接口 */
export interface IPagedResultRequest extends ILimitedResultRequest {
/** 当前页 */

37
vueJs/src/api/users.ts

@ -9,7 +9,6 @@ const IdentityServerUrl = process.env.VUE_APP_BASE_IDENTITY_SERVER
export default class UserApiService {
public static getUsers(input: UsersGetPagedDto) {
let _url = '/api/identity/users'
// 因为abp设计的原因, 需要前端组合页面
_url += '?skipCount=' + input.skipCount
_url += '&maxResultCount=' + input.maxResultCount
if (input.sorting) {
@ -57,6 +56,28 @@ export default class UserApiService {
return ApiService.Get<UserRoleDto>(_url, IdentityServiceUrl)
}
public static getUserClaims(userId: string) {
const _url = '/api/identity/users/claims/' + userId
return ApiService.Get<ListResultDto<UserClaim>>(_url, IdentityServiceUrl)
}
public static addUserClaim(userId: string, payload: UserClaimCreateOrUpdate) {
const _url = '/api/identity/users/claims/' + userId
return ApiService.Post<void>(_url, payload, IdentityServiceUrl)
}
public static updateUserClaim(userId: string, payload: UserClaimCreateOrUpdate) {
const _url = '/api/identity/users/claims/' + userId
return ApiService.Put<void>(_url, payload, IdentityServiceUrl)
}
public static deleteUserClaim(userId: string, payload: UserClaimDelete) {
let _url = '/api/identity/users/claims/' + userId
_url += '?claimType=' + payload.claimType
_url += '&claimValue=' + payload.claimValue
return ApiService.Delete(_url, IdentityServiceUrl)
}
public static getUserOrganizationUnits(userId: string) {
const _url = '/api/identity/users/organization-units/' + userId
return ApiService.Get<ListResultDto<OrganizationUnit>>(_url, IdentityServiceUrl)
@ -453,3 +474,17 @@ export interface IUserRole {
export class ChangeUserOrganizationUnitDto {
organizationUnitIds = new Array<string>()
}
export class UserClaimCreateOrUpdate {
claimType = ''
claimValue = ''
}
export class UserClaimDelete {
claimType = ''
claimValue = ''
}
export class UserClaim extends UserClaimCreateOrUpdate {
id!: string
}

12
vueJs/src/icons/components/claim-type.ts

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'claim-type': {
width: 128,
height: 128,
viewBox: '0 0 1024 1024',
data: '<path pid="0" _fill="#333" d="M384 268.8c0-17.067 0-25.6 4.267-29.867 4.266-8.533 8.533-12.8 17.066-17.066 8.534-8.534 12.8-8.534 34.134-8.534 17.066-25.6 42.666-42.666 72.533-42.666s59.733 17.066 72.533 42.666c17.067 0 25.6 0 34.134 4.267 8.533 4.267 12.8 8.533 17.066 17.067C640 243.2 640 247.467 640 268.8l-8.533-12.8h51.2C729.6 256 768 294.4 768 341.333v256c0 12.8-8.533 21.334-21.333 21.334s-21.334-8.534-21.334-21.334v-256c0-25.6-17.066-42.666-42.666-42.666h-59.734l17.067-12.8c0 17.066 0 25.6-4.267 29.866-4.266 8.534-8.533 12.8-17.066 17.067-8.534 8.533-12.8 8.533-34.134 8.533H435.2c-17.067 0-21.333 0-29.867-4.266-8.533-4.267-12.8-8.534-17.066-17.067C384 311.467 384 307.2 384 285.867l17.067 12.8h-59.734c-25.6 0-42.666 17.066-42.666 42.666V768c0 25.6 17.066 42.667 42.666 42.667h341.334c25.6 0 42.666-17.067 42.666-42.667v-42.667c0-12.8 8.534-21.333 21.334-21.333S768 712.533 768 725.333V768c0 46.933-38.4 85.333-85.333 85.333H341.333C294.4 853.333 256 814.933 256 768V341.333C256 294.4 294.4 256 341.333 256h51.2L384 268.8zm42.667 0v8.533c0 12.8 8.533 21.334 21.333 21.334h128c12.8 0 21.333-8.534 21.333-21.334V256H588.8c-17.067 0-29.867-8.533-38.4-21.333-8.533-12.8-21.333-21.334-38.4-21.334s-29.867 8.534-38.4 21.334c-4.267 12.8-21.333 21.333-34.133 21.333h-12.8v12.8zm192 200.533H405.333C392.533 469.333 384 460.8 384 448s8.533-21.333 21.333-21.333h213.334c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zm0 128H405.333C392.533 597.333 384 588.8 384 576s8.533-21.333 21.333-21.333h213.334c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zm0 128H405.333C392.533 725.333 384 716.8 384 704s8.533-21.333 21.333-21.333h213.334c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333z"/>'
}
})

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

@ -9,6 +9,7 @@ import './auditing'
import './back-top'
import './bug'
import './chart'
import './claim-type'
import './client'
import './clipboard'
import './component'

1
vueJs/src/icons/svg/claim-type.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="M384 268.8c0-17.066667 0-25.6 4.266667-29.866667 4.266667-8.533333 8.533333-12.8 17.066666-17.066666 8.533333-8.533333 12.8-8.533333 34.133334-8.533334 17.066667-25.6 42.666667-42.666667 72.533333-42.666666s59.733333 17.066667 72.533333 42.666666c17.066667 0 25.6 0 34.133334 4.266667 8.533333 4.266667 12.8 8.533333 17.066666 17.066667 4.266667 8.533333 4.266667 12.8 4.266667 34.133333l-8.533333-12.8H682.666667c46.933333 0 85.333333 38.4 85.333333 85.333333v256c0 12.8-8.533333 21.333333-21.333333 21.333334s-21.333333-8.533333-21.333334-21.333334V341.333333c0-25.6-17.066667-42.666667-42.666666-42.666666h-59.733334l17.066667-12.8c0 17.066667 0 25.6-4.266667 29.866666-4.266667 8.533333-8.533333 12.8-17.066666 17.066667-8.533333 8.533333-12.8 8.533333-34.133334 8.533333h-149.333333c-17.066667 0-21.333333 0-29.866667-4.266666-8.533333-4.266667-12.8-8.533333-17.066666-17.066667-4.266667-8.533333-4.266667-12.8-4.266667-34.133333l17.066667 12.8H341.333333c-25.6 0-42.666667 17.066667-42.666666 42.666666v426.666667c0 25.6 17.066667 42.666667 42.666666 42.666667h341.333334c25.6 0 42.666667-17.066667 42.666666-42.666667v-42.666667c0-12.8 8.533333-21.333333 21.333334-21.333333s21.333333 8.533333 21.333333 21.333333v42.666667c0 46.933333-38.4 85.333333-85.333333 85.333333H341.333333c-46.933333 0-85.333333-38.4-85.333333-85.333333V341.333333c0-46.933333 38.4-85.333333 85.333333-85.333333h51.2l-8.533333 12.8z m42.666667 0v8.533333c0 12.8 8.533333 21.333333 21.333333 21.333334h128c12.8 0 21.333333-8.533333 21.333333-21.333334v-8.533333V256h-8.533333c-17.066667 0-29.866667-8.533333-38.4-21.333333-8.533333-12.8-21.333333-21.333333-38.4-21.333334s-29.866667 8.533333-38.4 21.333334c-4.266667 12.8-21.333333 21.333333-34.133333 21.333333H426.666667v12.8zM618.666667 469.333333h-213.333334c-12.8 0-21.333333-8.533333-21.333333-21.333333s8.533333-21.333333 21.333333-21.333333h213.333334c12.8 0 21.333333 8.533333 21.333333 21.333333s-8.533333 21.333333-21.333333 21.333333zM618.666667 597.333333h-213.333334c-12.8 0-21.333333-8.533333-21.333333-21.333333s8.533333-21.333333 21.333333-21.333333h213.333334c12.8 0 21.333333 8.533333 21.333333 21.333333s-8.533333 21.333333-21.333333 21.333333zM618.666667 725.333333h-213.333334c-12.8 0-21.333333-8.533333-21.333333-21.333333s8.533333-21.333333 21.333333-21.333333h213.333334c12.8 0 21.333333 8.533333 21.333333 21.333333s-8.533333 21.333333-21.333333 21.333333z" /></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

3
vueJs/src/lang/en.ts

@ -83,7 +83,8 @@ export default {
filesystem: 'file system',
auditing: 'auditing',
auditLog: 'audit log',
securityLog: 'security log'
securityLog: 'security log',
claimType: 'claim type'
},
navbar: {
logOut: 'Log Out',

5
vueJs/src/lang/zh.ts

@ -83,7 +83,8 @@ export default {
filesystem: '文件系统',
auditing: '内部审计',
auditLog: '审计日志',
securityLog: '安全日志'
securityLog: '安全日志',
claimType: '声明类型'
},
navbar: {
logOut: '退出登录',
@ -603,7 +604,7 @@ export default {
filterString: '过滤字符',
searchList: '查询列表',
creationTime: '创建时间',
successful: '提交成功',
successful: '操作成功',
pleaseInputBy: '请输入{key}',
pleaseSelectBy: '请选择{key}',
none: '未定义',

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

@ -60,6 +60,16 @@ const adminRouter: RouteConfig = {
icon: 'organization-unit',
roles: ['AbpIdentity.OrganizationUnits']
}
},
{
path: 'claim-type',
component: () => import(/* webpackChunkName: "organization-unit" */ '@/views/admin/claim-type/index.vue'),
name: 'claim-type',
meta: {
title: 'claimType',
icon: 'claim-type',
roles: ['AbpIdentity.IdentityClaimTypes']
}
}
]
}

230
vueJs/src/views/admin/claim-type/components/CreateOrUpdateCliamTypeForm.vue

@ -0,0 +1,230 @@
<template>
<el-dialog
v-el-draggable-dialog
width="800px"
:visible="showDialog"
:title="title"
custom-class="modal-form"
:show-close="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
@close="onFormClosed(false)"
>
<el-form
ref="claimTypeForm"
:model="claimType"
label-width="120px"
:rules="claimTypeRules"
>
<el-form-item
prop="name"
:label="$t('AbpIdentity.IdentityClaim:Name')"
>
<el-input
v-model="claimType.name"
:disabled="isEditClaimType"
/>
</el-form-item>
<el-form-item
prop="description"
:label="$t('AbpIdentity.IdentityClaim:Description')"
>
<el-input
v-model="claimType.description"
/>
</el-form-item>
<el-form-item
prop="regex"
:label="$t('AbpIdentity.IdentityClaim:Regex')"
>
<el-input
v-model="claimType.regex"
/>
</el-form-item>
<el-form-item
prop="regexDescription"
:label="$t('AbpIdentity.IdentityClaim:RegexDescription')"
>
<el-input
v-model="claimType.regexDescription"
/>
</el-form-item>
<el-form-item
prop="valueType"
:label="$t('AbpIdentity.IdentityClaim:ValueType')"
>
<el-select
v-model="claimType.valueType"
style="width: 100%"
:disabled="isEditClaimType"
>
<el-option
v-for="valueType in claimValueTypes"
:key="valueType.name"
:label="valueType.name"
:value="valueType.value"
/>
</el-select>
</el-form-item>
<el-form-item
prop="required"
:label="$t('AbpIdentity.IdentityClaim:Required')"
>
<el-switch
v-model="claimType.required"
/>
</el-form-item>
<el-form-item
prop="isStatic"
:label="$t('AbpIdentity.IdentityClaim:IsStatic')"
>
<el-switch
v-model="claimType.isStatic"
:disabled="isEditClaimType"
/>
</el-form-item>
<el-form-item>
<el-button
class="cancel"
style="width:100px"
@click="onFormClosed(false)"
>
{{ $t('global.cancel') }}
</el-button>
<el-button
class="confirm"
type="primary"
style="width:100px"
@click="onSave"
>
{{ $t('global.confirm') }}
</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<script lang="ts">
import { Form } from 'element-ui'
import ClaimTypeApiService, {
IdentityClaimType,
IdentityClaimValueType,
IdentityClaimTypeCreate,
IdentityClaimTypeUpdate,
IdentityClaimTypeCreateOrUpdateBase
} from '@/api/cliam-type'
import { Component, Vue, Prop, Watch } from 'vue-property-decorator'
@Component({
name: 'CreateOrUpdateCliamTypeForm'
})
export default class CreateOrUpdateCliamTypeForm extends Vue {
@Prop({ default: '' })
private claimTypeId!: string
@Prop({ default: '' })
private title!: string
@Prop({ default: false })
private showDialog!: boolean
private hasChanged = false
private claimType = new IdentityClaimType()
private claimValueTypes = [
{ name: 'Boolean', value: IdentityClaimValueType.Boolean },
{ name: 'DateTime', value: IdentityClaimValueType.DateTime },
{ name: 'Int', value: IdentityClaimValueType.Int },
{ name: 'String', value: IdentityClaimValueType.String }
]
private claimTypeRules = {
name: [
{ required: true, message: this.l('pleaseInputBy', { key: this.l('AbpIdentity.IdentityClaim:Name') }), trigger: 'blur' }
],
valueType: [
{ required: true, message: this.l('pleaseSelectBy', { key: this.l('AbpIdentity.IdentityClaim:ValueType') }), trigger: 'blur' }
]
}
get isEditClaimType() {
if (this.claimTypeId) {
return true
}
return false
}
@Watch('claimTypeId')
private onClaimTypeIdChanged() {
this.handleGetClaimType()
}
@Watch('showDialog', { immediate: true })
private onShowDialogChanged() {
this.handleGetClaimType()
}
private handleGetClaimType() {
this.hasChanged = false
if (this.showDialog && this.claimTypeId) {
ClaimTypeApiService.getClaimType(this.claimTypeId).then(res => {
this.claimType = res
})
}
}
private onSave() {
const claimTypeForm = this.$refs.claimTypeForm as Form
claimTypeForm.validate(valid => {
if (valid) {
if (this.isEditClaimType) {
const updatePayload = new IdentityClaimTypeUpdate()
this.updateClaimTypeByInput(updatePayload)
ClaimTypeApiService.updateClaimType(this.claimTypeId, updatePayload).then(res => {
this.claimType = res
this.hasChanged = true
this.$message.success(this.l('global.successful'))
})
} else {
const createPayload = new IdentityClaimTypeCreate(this.claimType.name, this.claimType.isStatic, this.claimType.valueType)
this.updateClaimTypeByInput(createPayload)
ClaimTypeApiService.createClaimType(createPayload).then(() => {
claimTypeForm.resetFields()
this.hasChanged = true
this.$message.success(this.l('global.successful'))
this.onFormClosed(true)
})
}
}
})
}
private onFormClosed(changed: boolean) {
const claimTypeForm = this.$refs.claimTypeForm as Form
claimTypeForm.resetFields()
this.hasChanged = this.hasChanged ? this.hasChanged : changed
this.$emit('closed', this.hasChanged)
}
private updateClaimTypeByInput(claimType: IdentityClaimTypeCreateOrUpdateBase) {
claimType.regex = this.claimType.regex
claimType.regexDescription = this.claimType.regexDescription
claimType.required = this.claimType.required
claimType.description = this.claimType.description
}
private l(name: string, values?: any[] | { [key: string]: any }) {
return this.$t(name, values).toString()
}
}
</script>
<style scoped>
.confirm {
position: absolute;
right: 10px;
}
.cancel {
position: absolute;
right: 120px;
}
</style>

252
vueJs/src/views/admin/claim-type/index.vue

@ -0,0 +1,252 @@
<template>
<div class="app-container">
<div class="filter-container">
<label
class="radio-label"
style="padding-left:0;"
>{{ $t('global.queryFilter') }}</label>
<el-input
v-model="dataFilter.filter"
:placeholder="$t('global.filterString')"
style="width: 250px;margin-left: 10px;"
class="filter-item"
/>
<el-button
class="filter-item"
style="margin-left: 10px; text-alignt"
type="primary"
@click="refreshPagedData"
>
{{ $t('global.searchList') }}
</el-button>
<el-button
class="filter-item"
type="primary"
:disabled="!checkPermission(['AbpIdentity.IdentityClaimTypes.Create'])"
@click="handleCreateClaimType"
>
{{ $t('AbpIdentity.AddClaim') }}
</el-button>
</div>
<el-table
v-loading="dataLoading"
row-key="id"
:data="dataList"
stripe
border
fit
highlight-current-row
@sort-change="handleSortChange"
>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:Name')"
prop="name"
sortable
width="300px"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.name }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:ValueType')"
prop="valueType"
sortable
width="150px"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.valueType | claimValueTypeFilter }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:Description')"
prop="description"
sortable
min-width="100%"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.description }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:Regex')"
prop="regex"
sortable
width="200px"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.regex }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:Required')"
prop="required"
sortable
width="150px"
align="center"
>
<template slot-scope="{row}">
<el-switch
v-model="row.required"
disabled
/>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.IdentityClaim:IsStatic')"
prop="isStatic"
sortable
width="150px"
align="center"
>
<template slot-scope="{row}">
<el-switch
v-model="row.isStatic"
disabled
/>
</template>
</el-table-column>
<el-table-column
:label="$t('operaActions')"
align="center"
width="260px"
fixed="right"
>
<template slot-scope="{row}">
<el-button
:disabled="!allowedEditClaim(row)"
size="mini"
type="primary"
@click="handleUpdateClaimType(row)"
>
{{ $t('AbpIdentity.UpdateClaim') }}
</el-button>
<el-button
:disabled="!allowedDeleteClaim(row)"
size="mini"
type="danger"
@click="handleDeleteClaimType(row)"
>
{{ $t('AbpIdentity.DeleteClaim') }}
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="dataTotal>0"
:total="dataTotal"
:page.sync="currentPage"
:limit.sync="pageSize"
@pagination="refreshPagedData"
/>
<create-or-update-cliam-type-form
:title="editClaimTypeTitle"
:claim-type-id="editClaimTypeId"
:show-dialog="showClaimTypeDialog"
@closed="onClaimTypeDialogClosed"
/>
</div>
</template>
<script lang="ts">
import { checkPermission } from '@/utils/permission'
import { abpPagerFormat } from '@/utils'
import Pagination from '@/components/Pagination/index.vue'
import DataListMiXin from '@/mixins/DataListMiXin'
import Component, { mixins } from 'vue-class-component'
import CreateOrUpdateCliamTypeForm from './components/CreateOrUpdateCliamTypeForm.vue'
import ClaimTypeApiService, { IdentityClaimType, IdentityClaimTypeGetByPaged, IdentityClaimValueType } from '@/api/cliam-type'
const valueTypeMap: { [key: number]: string } = {
[IdentityClaimValueType.String]: 'String',
[IdentityClaimValueType.Boolean]: 'Boolean',
[IdentityClaimValueType.DateTime]: 'DateTime',
[IdentityClaimValueType.Int]: 'Int'
}
@Component({
name: 'ClaimType',
components: {
Pagination,
CreateOrUpdateCliamTypeForm
},
filters: {
claimValueTypeFilter(valueType: IdentityClaimValueType) {
return valueTypeMap[valueType]
}
},
methods: {
checkPermission
}
})
export default class ClaimType extends mixins(DataListMiXin) {
private editClaimTypeId = ''
private editClaimTypeTitle = ''
private showClaimTypeDialog = false
public dataFilter = new IdentityClaimTypeGetByPaged()
mounted() {
this.refreshPagedData()
}
get allowedEditClaim() {
return (claimType: IdentityClaimType) => {
return !claimType.isStatic && checkPermission(['AbpIdentity.IdentityClaimTypes.Update'])
}
}
get allowedDeleteClaim() {
return (claimType: IdentityClaimType) => {
return !claimType.isStatic && checkPermission(['AbpIdentity.IdentityClaimTypes.Delete'])
}
}
protected processDataFilter() {
this.dataFilter.skipCount = abpPagerFormat(this.currentPage, this.pageSize)
}
protected getPagedList() {
return ClaimTypeApiService.getClaimTypes(this.dataFilter)
}
private handleCreateClaimType() {
this.editClaimTypeId = ''
this.editClaimTypeTitle = this.l('AbpIdentity.IdentityClaim:New')
this.showClaimTypeDialog = true
}
private handleUpdateClaimType(claimType: IdentityClaimType) {
this.editClaimTypeId = claimType.id
this.editClaimTypeTitle = this.l('AbpIdentity.ClaimSubject', { 0: claimType.name })
this.showClaimTypeDialog = true
}
private handleDeleteClaimType(claimType: IdentityClaimType) {
this.$confirm(this.l('AbpIdentity.WillDeleteClaim', { 0: claimType.name }),
this.l('AbpUi.AreYouSure'), {
callback: (action) => {
if (action === 'confirm') {
ClaimTypeApiService.deleteClaimType(claimType.id).then(() => {
this.$message.success(this.l('global.successful'))
this.refreshPagedData()
})
}
}
})
}
private onClaimTypeDialogClosed(changed: boolean) {
this.showClaimTypeDialog = false
if (changed) {
this.refreshPagedData()
}
}
}
</script>

124
vueJs/src/views/admin/identityServer/client/components/ClientClaimEditForm.vue

@ -19,19 +19,48 @@
prop="type"
:label="$t('identityServer.claimType')"
>
<el-input
<el-select
v-model="clientClaim.type"
:placeholder="$t('pleaseInputBy', {key: $t('identityServer.claimType')})"
/>
style="width: 100%"
:placeholder="$t('pleaseSelectBy', {key: $t('identityServer.claimType')})"
@change="onClaimTypeChanged"
>
<el-option
v-for="claim in claimTypes"
:key="claim.id"
:label="claim.name"
:value="claim.name"
/>
</el-select>
</el-form-item>
<el-form-item
prop="value"
:label="$t('identityServer.claimValue')"
>
<el-input
v-if="hasStringValueType(clientClaim.type)"
v-model="clientClaim.value"
type="text"
:placeholder="$t('pleaseInputBy', {key: $t('identityServer.claimValue')})"
/>
<el-input
v-else-if="hasIntegerValueType(clientClaim.type)"
v-model="clientClaim.value"
type="number"
:placeholder="$t('pleaseInputBy', {key: $t('identityServer.claimValue')})"
/>
<el-switch
v-else-if="hasBooleanValueType(clientClaim.type)"
v-model="clientClaim.value"
:placeholder="$t('pleaseInputBy', {key: $t('identityServer.claimValue')})"
/>
<el-date-picker
v-else-if="hasDateTimeValueType(clientClaim.type)"
v-model="clientClaim.value"
type="datetime"
style="width: 100%"
:placeholder="$t('pleaseInputBy', {key: $t('identityServer.claimValue')})"
/>
</el-form-item>
<el-form-item
@ -64,7 +93,7 @@
:label="$t('identityServer.claimType')"
prop="type"
sortable
width="200px"
width="150px"
align="center"
>
<template slot-scope="{row}">
@ -75,24 +104,23 @@
:label="$t('identityServer.claimValue')"
prop="value"
sortable
min-width="400px"
min-width="100%"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.value }}</span>
<span>{{ claimValue(row.type, row.value) }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('operaActions')"
align="center"
width="150px"
fixed="right"
>
<template slot-scope="{row}">
<el-button
:disabled="!checkPermission(['IdentityServer.Clients.Claims.Delete'])"
size="mini"
type="primary"
type="danger"
@click="handleDeleteClientClaim(row.type, row.value)"
>
{{ $t('identityServer.deleteClaim') }}
@ -104,6 +132,8 @@
</template>
<script lang="ts">
import { dateFormat } from '@/utils/index'
import ClaimTypeApiService, { IdentityClaimType, IdentityClaimValueType } from '@/api/cliam-type'
import ClientService, { ClientClaim, ClientClaimCreate } from '@/api/clients'
import { Component, Vue, Prop, Watch } from 'vue-property-decorator'
import { checkPermission } from '@/utils/permission'
@ -125,6 +155,7 @@ export default class extends Vue {
private clientClaims!: ClientClaim[]
private clientClaim: ClientClaimCreate
private claimTypes = new Array<IdentityClaimType>()
private clientClaimRules = {
type: [
{ required: true, message: this.l('pleaseInputBy', { key: this.l('identityServer.claimType') }), trigger: 'change' }
@ -134,6 +165,55 @@ export default class extends Vue {
]
}
get cliamType() {
return (claimName: string) => {
const claimIndex = this.claimTypes.findIndex(cliam => cliam.name === claimName)
if (claimIndex >= 0) {
return this.claimTypes[claimIndex].valueType
}
return IdentityClaimValueType.String
}
}
get claimValue() {
return (type: string, value: string) => {
const valueType = this.cliamType(type)
switch (valueType) {
case IdentityClaimValueType.Int :
case IdentityClaimValueType.String :
return value
case IdentityClaimValueType.Boolean :
return value.toLowerCase() === 'true'
case IdentityClaimValueType.DateTime :
return dateFormat(new Date(value), 'YYYY-mm-dd HH:MM:SS')
}
}
}
get hasStringValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.String
}
}
get hasBooleanValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.Boolean
}
}
get hasDateTimeValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.DateTime
}
}
get hasIntegerValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.Int
}
}
constructor() {
super()
this.clientClaim = new ClientClaimCreate()
@ -144,6 +224,16 @@ export default class extends Vue {
this.clientClaim.clientId = this.clientId
}
mounted() {
this.handleGetClaimTypes()
}
private handleGetClaimTypes() {
ClaimTypeApiService.getActivedClaimTypes().then(res => {
this.claimTypes = res.items
})
}
private handleDeleteClientClaim(type: string, value: string) {
this.$confirm(this.l('identityServer.deleteClaimByType', { type: value }),
this.l('identityServer.deleteClaim'), {
@ -160,6 +250,24 @@ export default class extends Vue {
})
}
private onClaimTypeChanged() {
const valueType = this.cliamType(this.clientClaim.type)
switch (valueType) {
case IdentityClaimValueType.Int :
this.clientClaim.value = '0'
break
case IdentityClaimValueType.String :
this.clientClaim.value = ''
break
case IdentityClaimValueType.Boolean :
this.clientClaim.value = 'false'
break
case IdentityClaimValueType.DateTime :
this.clientClaim.value = ''
break
}
}
private onSaveClientClaim() {
const frmClientClaim = this.$refs.formClientClaim as any
frmClientClaim.validate((valid: boolean) => {

297
vueJs/src/views/admin/users/components/UserClaimCreateOrUpdateForm.vue

@ -0,0 +1,297 @@
<template>
<el-dialog
v-el-draggable-dialog
width="800px"
:visible="showDialog"
:title="title"
custom-class="modal-form"
:show-close="false"
:close-on-click-modal="true"
:close-on-press-escape="true"
@close="onFormClosed(false)"
>
<el-form
ref="userClaimForm"
:model="editUserClaim"
label-width="120px"
:rules="userClaimRules"
>
<el-form-item
prop="claimType"
:label="$t('AbpIdentity.DisplayName:ClaimType')"
>
<el-select
v-model="editUserClaim.claimType"
style="width: 100%"
@change="onClaimTypeChanged"
>
<el-option
v-for="claim in claimTypes"
:key="claim.id"
:label="claim.name"
:value="claim.name"
/>
</el-select>
</el-form-item>
<el-form-item
prop="claimValue"
:label="$t('AbpIdentity.DisplayName:ClaimValue')"
>
<el-input
v-if="hasStringValueType(editUserClaim.claimType)"
v-model="editUserClaim.claimValue"
type="text"
/>
<el-input
v-else-if="hasIntegerValueType(editUserClaim.claimType)"
v-model="editUserClaim.claimValue"
type="number"
/>
<el-switch
v-else-if="hasBooleanValueType(editUserClaim.claimType)"
v-model="editUserClaim.claimValue"
/>
<el-date-picker
v-else-if="hasDateTimeValueType(editUserClaim.claimType)"
v-model="editUserClaim.claimValue"
type="datetime"
style="width: 100%"
/>
</el-form-item>
<el-form-item
style="text-align: center;"
label-width="0px"
>
<el-button
type="primary"
style="width:180px"
@click="onSave"
>
{{ $t('AbpIdentity.AddClaim') }}
</el-button>
</el-form-item>
</el-form>
<el-table
row-key="id"
:data="userClaims"
border
fit
highlight-current-row
style="width: 100%;"
>
<el-table-column
:label="$t('AbpIdentity.DisplayName:ClaimType')"
prop="claimType"
sortable
width="150px"
align="center"
>
<template slot-scope="{row}">
<span>{{ row.claimType }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('AbpIdentity.DisplayName:ClaimValue')"
prop="claimValue"
sortable
min-width="100%"
align="center"
>
<template slot-scope="{row}">
<span>{{ claimValue(row.claimType, row.claimValue) }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('operaActions')"
align="center"
width="150px"
>
<template slot-scope="{row}">
<el-button
:disabled="!checkPermission(['AbpIdentity.Users.ManageClaims'])"
size="mini"
type="danger"
@click="handleDeleteUserClaim(row)"
>
{{ $t('AbpIdentity.DeleteClaim') }}
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script lang="ts">
import { dateFormat } from '@/utils/index'
import { checkPermission } from '@/utils/permission'
import { Component, Vue, Prop, Watch } from 'vue-property-decorator'
import UserService, { UserClaim, UserClaimCreateOrUpdate, UserClaimDelete } from '@/api/users'
import ClaimTypeApiService, { IdentityClaimType, IdentityClaimValueType } from '@/api/cliam-type'
import { Form } from 'element-ui'
@Component({
name: 'UserClaimCreateOrUpdateForm',
methods: {
checkPermission
}
})
export default class UserClaimCreateOrUpdateForm extends Vue {
@Prop({ default: '' })
private userId!: string
@Prop({ default: '' })
private title!: string
@Prop({ default: false })
private showDialog!: boolean
private editUserClaim = new UserClaimCreateOrUpdate()
private userClaims = new Array<UserClaim>()
private claimTypes = new Array<IdentityClaimType>()
private userClaimRules = {}
get cliamType() {
return (claimName: string) => {
const claimIndex = this.claimTypes.findIndex(cliam => cliam.name === claimName)
if (claimIndex >= 0) {
return this.claimTypes[claimIndex].valueType
}
return IdentityClaimValueType.String
}
}
get claimValue() {
return (type: string, value: string) => {
const valueType = this.cliamType(type)
switch (valueType) {
case IdentityClaimValueType.Int :
case IdentityClaimValueType.String :
return value
case IdentityClaimValueType.Boolean :
return value.toLowerCase() === 'true'
case IdentityClaimValueType.DateTime :
return dateFormat(new Date(value), 'YYYY-mm-dd HH:MM:SS')
}
}
}
get hasStringValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.String
}
}
get hasBooleanValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.Boolean
}
}
get hasDateTimeValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.DateTime
}
}
get hasIntegerValueType() {
return (claimName: string) => {
return this.cliamType(claimName) === IdentityClaimValueType.Int
}
}
@Watch('userId')
private onUserIdChanged() {
if (this.userId && this.showDialog) {
this.handleGetUserClaims()
}
}
mounted() {
this.handleGetClaimTypes()
this.handleGetUserClaims()
this.userClaimRules = {
claimType: [
{ required: true, message: this.l('pleaseSelectBy', { key: this.l('AbpIdentity.DisplayName:ClaimType') }), trigger: 'blur' }
],
claimValue: [
{ required: true, message: this.l('pleaseInputBy', { key: this.l('AbpIdentity.DisplayName:ClaimValue') }), trigger: 'blur' }
]
}
}
private handleGetClaimTypes() {
ClaimTypeApiService.getActivedClaimTypes().then(res => {
this.claimTypes = res.items
})
}
private handleGetUserClaims() {
if (this.userId) {
UserService.getUserClaims(this.userId).then(res => {
this.userClaims = res.items
})
}
}
private handleDeleteUserClaim(claim: UserClaim) {
this.$confirm(this.l('AbpIdentity.DeleteClaim'),
this.l('AbpUi.AreYouSure'), {
callback: (action) => {
if (action === 'confirm') {
const deleteClaim = new UserClaimDelete()
deleteClaim.claimType = claim.claimType
deleteClaim.claimValue = claim.claimValue
UserService.deleteUserClaim(this.userId, deleteClaim).then(() => {
this.$message.success(this.l('global.successful'))
const claimIndex = this.userClaims.findIndex(uc => uc.id === claim.id)
this.userClaims.splice(claimIndex, 1)
})
}
}
})
}
// TODO: ,/
private onClaimTypeChanged() {
const valueType = this.cliamType(this.editUserClaim.claimType)
switch (valueType) {
case IdentityClaimValueType.Int :
this.editUserClaim.claimValue = '0'
break
case IdentityClaimValueType.String :
this.editUserClaim.claimValue = ''
break
case IdentityClaimValueType.Boolean :
this.editUserClaim.claimValue = 'false'
break
case IdentityClaimValueType.DateTime :
this.editUserClaim.claimValue = ''
break
}
}
private onSave() {
const userClaimForm = this.$refs.userClaimForm as Form
userClaimForm.validate(valid => {
if (valid) {
UserService.addUserClaim(this.userId, this.editUserClaim).then(() => {
this.$message.success(this.$t('global.successful').toString())
userClaimForm.resetFields()
this.handleGetUserClaims()
})
}
})
}
private onFormClosed(changed: boolean) {
const userClaimForm = this.$refs.userClaimForm as Form
userClaimForm.resetFields()
this.$emit('closed', changed)
}
private l(name: string, values?: any[] | { [key: string]: any }) {
return this.$t(name, values).toString()
}
}
</script>

30
vueJs/src/views/admin/users/index.vue

@ -130,6 +130,12 @@
{{ $t('users.otherOpera') }}<i class="el-icon-arrow-down el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
:command="{key: 'claim', row}"
:disabled="!checkPermission(['AbpIdentity.Users.ManageClaims'])"
>
管理声明
</el-dropdown-item>
<el-dropdown-item
:command="{key: 'lock', row}"
:disabled="!checkPermission(['AbpIdentity.Users.Update'])"
@ -181,6 +187,13 @@
@onUserProfileChanged="handleUserProfileChanged"
/>
</el-dialog>
<user-claim-create-or-update-form
:show-dialog="showClaimDialog"
:user-id="editUser.id"
:title="$t('AbpIdentity.ClaimSubject', {0: editUser.name})"
@closed="onClaimDialogClosed"
/>
</div>
</template>
@ -192,6 +205,7 @@ import { dateFormat, abpPagerFormat } from '@/utils'
import UserApiService, { UserDataDto, UsersGetPagedDto } from '@/api/users'
import UserCreateForm from './components/UserCreateForm.vue'
import UserEditForm from './components/UserEditForm.vue'
import UserClaimCreateOrUpdateForm from './components/UserClaimCreateOrUpdateForm.vue'
import { checkPermission } from '@/utils/permission'
@Component({
@ -199,7 +213,8 @@ import { checkPermission } from '@/utils/permission'
components: {
Pagination,
UserEditForm,
UserCreateForm
UserCreateForm,
UserClaimCreateOrUpdateForm
},
filters: {
dateTimeFilter(datetime: string) {
@ -219,6 +234,7 @@ export default class extends mixins(DataListMiXin) {
private showCreateUserDialog = false
private showEditUserDialog = false
private showClaimDialog = false
mounted() {
this.refreshPagedData()
@ -260,9 +276,21 @@ export default class extends mixins(DataListMiXin) {
this.showCreateUserDialog = true
}
private handleShowCliamDialog(row: UserDataDto) {
this.editUser = row
this.showClaimDialog = true
}
private onClaimDialogClosed() {
this.showClaimDialog = false
}
/** 响应更多操作命令 */
private handleCommand(command: any) {
switch (command.key) {
case 'claim' :
this.handleShowCliamDialog(command.row)
break
case 'lock' :
this.handleLockUser(command.row)
break

Loading…
Cancel
Save