Browse Source

Increase the Api: IIdentityClaimTypeAppService

pull/105/head
cKey 5 years ago
parent
commit
02e545aab6
  1. 31
      aspnet-core/database/ApiGateway-Init-SqlServer.sql
  2. 60
      aspnet-core/database/ApiGateway-Init.sql
  3. 12
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimDto.cs
  4. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateDto.cs
  5. 22
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeCreateOrUpdateBaseDto.cs
  6. 23
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeDto.cs
  7. 9
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeGetByPagedDto.cs
  8. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityClaimTypeUpdateDto.cs
  9. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimCreateDto.cs
  10. 6
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimDeleteDto.cs
  11. 13
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityRoleClaimUpdateDto.cs
  12. 17
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimCreateDto.cs
  13. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimDeleteDto.cs
  14. 13
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Dto/IdentityUserClaimUpdateDto.cs
  15. 18
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityClaimTypeAppService.cs
  16. 16
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityRoleAppService.cs
  17. 19
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IIdentityUserAppService.cs
  18. 8
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityErrorCodes.cs
  19. 7
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissionDefinitionProvider.cs
  20. 10
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissions.cs
  21. 25
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/en.json
  22. 25
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/Localization/zh-Hans.json
  23. 8
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/AbpIdentityApplicationModuleAutoMapperProfile.cs
  24. 129
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityClaimTypeAppService.cs
  25. 64
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityRoleAppService.cs
  26. 62
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application/LINGYUN/Abp/Identity/IdentityUserAppService.cs
  27. 38
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityRoleController.cs
  28. 38
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IIdentityUserController.cs
  29. 63
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityClaimTypeController.cs
  30. 74
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityRoleController.cs
  31. 74
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.HttpApi/LINGYUN/Abp/Identity/IdentityUserController.cs
  32. 4
      aspnet-core/services/account/AuthServer.Host/AuthServer.Host.csproj
  33. 2
      aspnet-core/services/account/AuthServer.Host/Properties/launchSettings.json
  34. BIN
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db
  35. 93
      vueJs/src/api/cliam-type.ts
  36. 24
      vueJs/src/api/types.ts
  37. 37
      vueJs/src/api/users.ts
  38. 12
      vueJs/src/icons/components/claim-type.ts
  39. 1
      vueJs/src/icons/components/index.ts
  40. 1
      vueJs/src/icons/svg/claim-type.svg
  41. 3
      vueJs/src/lang/en.ts
  42. 5
      vueJs/src/lang/zh.ts
  43. 10
      vueJs/src/router/modules/admin.ts
  44. 230
      vueJs/src/views/admin/claim-type/components/CreateOrUpdateCliamTypeForm.vue
  45. 252
      vueJs/src/views/admin/claim-type/index.vue
  46. 124
      vueJs/src/views/admin/identityServer/client/components/ClientClaimEditForm.vue
  47. 297
      vueJs/src/views/admin/users/components/UserClaimCreateOrUpdateForm.vue
  48. 30
      vueJs/src/views/admin/users/index.vue

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

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

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

@ -46,8 +46,4 @@
<ProjectReference Include="..\..\..\modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Pages\Account\" />
</ItemGroup>
</Project>

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

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