Browse Source

添加组织机构

pull/43/head
王军 4 years ago
parent
commit
323a8461ca
  1. 25
      aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs
  2. 13
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs
  3. 5
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs
  4. 4
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs
  5. 5
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs
  6. 8
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json
  7. 7
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json
  8. 113
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs
  9. 7
      aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json
  10. 2
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs
  11. 6
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json
  12. 7
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json
  13. 9
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs
  14. 4
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs
  15. 5
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs
  16. 13
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs
  17. 6
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs
  18. 3
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs
  19. 4
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json
  20. 158
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs
  21. 8
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs
  22. 74
      aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs
  23. 25
      aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs
  24. 16
      aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs
  25. 5
      aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs
  26. 10
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs
  27. 19
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj
  28. 13
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs
  29. 5
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json
  30. 5
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json
  31. 5
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json
  32. 5
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json
  33. 12
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs
  34. 9
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs
  35. 6
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs
  36. 16
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json
  37. 15
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json
  38. 2
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs
  39. 291
      aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs
  40. 11
      aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs
  41. 21
      aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs
  42. 50
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs
  43. 46
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs
  44. 20
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs
  45. 4
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs
  46. 3
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs
  47. 8
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs
  48. 3
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs
  49. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs
  50. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs
  51. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs
  52. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs
  53. 20
      vben271/src/router/routes/modules/admin.ts
  54. 4
      vben271/src/services/ServiceProxyBase.ts
  55. 106
      vben271/src/views/admin/auditLog/AuditLog.ts
  56. 89
      vben271/src/views/admin/auditLog/AuditLog.vue
  57. 326
      vben271/src/views/admin/dictionary/AbpDictionary.ts
  58. 353
      vben271/src/views/admin/dictionary/AbpDictionary.vue
  59. 104
      vben271/src/views/admin/dictionary/CreateAbpDictionary.vue
  60. 95
      vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue
  61. 100
      vben271/src/views/admin/dictionary/EditAbpDictionary.vue
  62. 99
      vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue
  63. 54
      vben271/src/views/admin/elasticSearch/ElasticSearch.ts
  64. 119
      vben271/src/views/admin/elasticSearch/ElasticSearch.vue
  65. 35
      vben271/src/views/admin/files/File.ts
  66. 146
      vben271/src/views/admin/files/File.vue
  67. 36
      vben271/src/views/admin/files/UploadOss.ts
  68. 62
      vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue
  69. 111
      vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue
  70. 128
      vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue
  71. 98
      vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue
  72. 174
      vben271/src/views/admin/organizationUnits/OrganizationUnit.ts
  73. 93
      vben271/src/views/admin/organizationUnits/OrganizationUnit.vue
  74. 113
      vben271/src/views/admin/roles/AbpRole.ts
  75. 183
      vben271/src/views/admin/roles/AbpRole.vue
  76. 94
      vben271/src/views/admin/roles/CreateAbpRole.vue
  77. 118
      vben271/src/views/admin/roles/EditAbpRole.vue
  78. 2
      vben271/src/views/admin/settings/Setting.ts
  79. 227
      vben271/src/views/admin/users/AbpUser.ts
  80. 162
      vben271/src/views/admin/users/CreateAbpUser.vue
  81. 233
      vben271/src/views/admin/users/EditAbpUser.vue

25
aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs

@ -75,5 +75,30 @@ namespace Lion.AbpPro.Extension.System
var result = length == 10 ? start.AddSeconds(jsTime) : start.AddMilliseconds(jsTime); var result = length == 10 ? start.AddSeconds(jsTime) : start.AddMilliseconds(jsTime);
return result.ToUniversalTime(); return result.ToUniversalTime();
} }
/// <summary>
/// 获取指定日期 当天的最大时间
/// 例如 2021-09-10 11:22:33.123456 转换后 2021-09-10 23:59:59.9999999
/// </summary>
public static DateTime? ToCurrentDateMaxDateTime(this DateTime? dateTime)
{
return dateTime?.Date.AddDays(1).AddTicks(-1);
}
/// <summary>
/// 获取指定时间的下一秒
/// 例如 2021-09-10 11:11:11.1234567 转换后 2021-09-10 11:11:12.0000000
/// </summary>
public static DateTime? ToNextSecondDateTime(this DateTime? dateTime)
{
if (!dateTime.HasValue)
{
return null;
}
return new DateTime(dateTime.Value.Year, dateTime.Value.Month, dateTime.Value.Day, dateTime.Value.Hour,
dateTime.Value.Minute, dateTime.Value.Second)
.AddSeconds(1);
}
} }
} }

13
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs

@ -5,16 +5,17 @@ using Volo.Abp;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
public class DataDictionaryDomainException : UserFriendlyException public class DataDictionaryDomainException : BusinessException
{ {
public DataDictionaryDomainException(string message, string code = null, string details = null, public DataDictionaryDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException, logLevel) innerException,
logLevel
)
{ {
} }
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base( public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
serializationInfo, context)
{ {
} }
} }

5
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs

@ -5,5 +5,10 @@ namespace Lion.AbpPro.DataDictionaryManagement
public class DataDictionaryManagementConsts public class DataDictionaryManagementConsts
{ {
public static Guid SeedDataDictionaryId = new Guid("39fdb236-a90e-e4b5-02a0-2866a8cf9821"); public static Guid SeedDataDictionaryId = new Guid("39fdb236-a90e-e4b5-02a0-2866a8cf9821");
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro.DataDictionaryManagement";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
} }
} }

4
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs

@ -23,14 +23,14 @@ namespace Lion.AbpPro.DataDictionaryManagement
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<DataDictionaryManagementResource>("en") .Add<DataDictionaryManagementResource>(DataDictionaryManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/DataDictionaryManagement"); .AddVirtualJson("/Localization/DataDictionaryManagement");
}); });
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>
{ {
options.MapCodeNamespace("DataDictionaryManagement", typeof(DataDictionaryManagementResource)); options.MapCodeNamespace(DataDictionaryManagementConsts.NameSpace, typeof(DataDictionaryManagementResource));
}); });
} }
} }

5
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs

@ -2,6 +2,9 @@ namespace Lion.AbpPro.DataDictionaryManagement
{ {
public static class DataDictionaryManagementErrorCodes public static class DataDictionaryManagementErrorCodes
{ {
//Add your business exception error codes here... public const string DataDictionaryExist =DataDictionaryManagementConsts.NameSpace+ ":100001";
public const string DataDictionaryNotExist =DataDictionaryManagementConsts.NameSpace+ ":100002";
public const string DataDictionaryDetailExist =DataDictionaryManagementConsts.NameSpace+ ":100003";
public const string DataDictionaryDetailNotExist =DataDictionaryManagementConsts.NameSpace+ ":100004";
} }
} }

8
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json

@ -6,6 +6,12 @@
"Permission:DataDictionaryManagement": "DataDictionaryManagement", "Permission:DataDictionaryManagement": "DataDictionaryManagement",
"Permission:Create": "Create", "Permission:Create": "Create",
"Permission:Update": "Update", "Permission:Update": "Update",
"Permission:Delete": "Delete" "Permission:Delete": "Delete",
"Lion.AbpPro.DataDictionaryManagement:100001": "DataDictionary Exist",
"Lion.AbpPro.DataDictionaryManagement:100002": "DataDictionary Not Exist",
"Lion.AbpPro.DataDictionaryManagement:100003": "DataDictionaryDetail Exist",
"Lion.AbpPro.DataDictionaryManagement:100004": "DataDictionaryDetail Not Exist"
} }
} }

7
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json

@ -6,6 +6,11 @@
"Permission:DataDictionaryManagement": "数据字典", "Permission:DataDictionaryManagement": "数据字典",
"Permission:Create": "创建", "Permission:Create": "创建",
"Permission:Update": "编辑", "Permission:Update": "编辑",
"Permission:Delete": "删除" "Permission:Delete": "删除",
"Lion.AbpPro.DataDictionaryManagement:100001": "数据字典已存在",
"Lion.AbpPro.DataDictionaryManagement:100002": "数据字典不存在",
"Lion.AbpPro.DataDictionaryManagement:100003": "数据字典明细已存在",
"Lion.AbpPro.DataDictionaryManagement:100004": "数据字典明细不存在"
} }
} }

113
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs

@ -4,8 +4,8 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto;
using Volo.Abp;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Domain.Services;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
@ -22,22 +22,28 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
_cache = cache; _cache = cache;
} }
public async Task<DataDictionaryDto> FindByIdAsync( public async Task<DataDictionaryDto> FindByIdAsync(
Guid id, Guid id,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null); var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null);
return await _cache.GetOrAddAsync(cacheKey, return await _cache.GetOrAddAsync
(
cacheKey,
async () => async () =>
{ {
var entity = var entity =
await _dataDictionaryRepository.FindByIdAsync(id, true, await _dataDictionaryRepository.FindByIdAsync
cancellationToken); (
id,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity); return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken); },
token: cancellationToken
);
} }
public async Task<DataDictionaryDto> FindByCodeAsync( public async Task<DataDictionaryDto> FindByCodeAsync(
@ -45,14 +51,22 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code); var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code);
return await _cache.GetOrAddAsync(cacheKey, return await _cache.GetOrAddAsync
(
cacheKey,
async () => async () =>
{ {
var entity = var entity =
await _dataDictionaryRepository.FindByCodeAsync(code, true, await _dataDictionaryRepository.FindByCodeAsync
cancellationToken); (
code,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity); return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken); },
token: cancellationToken
);
} }
@ -62,10 +76,21 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="code"></param> /// <param name="code"></param>
/// <param name="displayText"></param> /// <param name="displayText"></param>
/// <param name="description"></param> /// <param name="description"></param>
public Task<DataDictionary> CreateAsync(string code, string displayText, string description) public async Task<DataDictionary> CreateAsync(string code, string displayText, string description)
{ {
var entity = new DataDictionary(GuidGenerator.Create(), code, displayText, description); Check.NotNullOrWhiteSpace(code, nameof(code));
return _dataDictionaryRepository.InsertAsync(entity); var entity = await _dataDictionaryRepository.FindByCodeAsync(code);
if (entity != null) throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryExist);
entity = new DataDictionary
(
GuidGenerator.Create(),
code,
displayText,
description
);
return await _dataDictionaryRepository.InsertAsync(entity);
} }
/// <summary> /// <summary>
@ -77,36 +102,47 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="description"></param> /// <param name="description"></param>
/// <param name="order"></param> /// <param name="order"></param>
/// <exception cref="DataDictionaryDomainException"></exception> /// <exception cref="DataDictionaryDomainException"></exception>
public async Task<DataDictionary> CreateDetailAsync(Guid dataDictionaryId, string code, public async Task<DataDictionary> CreateDetailAsync(
Guid dataDictionaryId,
string code,
string displayText, string displayText,
string description, string description,
int order) int order)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
if (entity.Details.Any(e => e.Code == code.Trim())) if (entity.Details.Any(e => e.Code == code.Trim()))
{ {
throw new DataDictionaryDomainException(message: $"字典项{code}已存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
} }
entity.AddDetail(GuidGenerator.Create(), code, displayText, order, description); entity.AddDetail
(
GuidGenerator.Create(),
code,
displayText,
order,
description
);
return await _dataDictionaryRepository.UpdateAsync(entity); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
/// <summary> /// <summary>
/// 设置字典明细状态 /// 设置字典明细状态
/// </summary> /// </summary>
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId, public async Task<DataDictionary> SetStatus(
Guid dataDictionayDetailId, bool isEnabled) Guid dataDictionaryId,
Guid dataDictionayDetailId,
bool isEnabled)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) if (null == detail)
{ {
throw new DataDictionaryDomainException(message: $"字典项不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
} }
detail.SetIsEnabled(isEnabled); detail.SetIsEnabled(isEnabled);
@ -125,14 +161,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) if (null == detail)
{ {
throw new DataDictionaryDomainException(message: $"字典项不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
} }
detail.UpdateDetail(dataDictionayDetailId, displayText, description, order); detail.UpdateDetail
(
dataDictionayDetailId,
displayText,
description,
order
);
return await _dataDictionaryRepository.UpdateAsync(entity); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
@ -140,27 +182,29 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) if (null == detail)
{ {
throw new DataDictionaryDomainException(message: $"字典项不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
} }
entity.Details.Remove(detail); entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity); await _dataDictionaryRepository.UpdateAsync(entity);
} }
public async Task<DataDictionary> UpdateAsync(Guid dataDictionaryId,
public async Task<DataDictionary> UpdateAsync(
Guid dataDictionaryId,
string displayText, string displayText,
string description) string description)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
entity.Update(dataDictionaryId,displayText,description); entity.Update(dataDictionaryId, displayText, description);
return await _dataDictionaryRepository.UpdateAsync(entity); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
/// <summary> /// <summary>
/// 删除字典类型 /// 删除字典类型
/// </summary> /// </summary>
@ -170,13 +214,14 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(id); var entity = await _dataDictionaryRepository.FindByIdAsync(id);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id); var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id);
if (detail !=null ) if (detail != null)
{ {
entity.Details.Remove(detail); entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity); await _dataDictionaryRepository.UpdateAsync(entity);
} }
await _dataDictionaryRepository.DeleteAsync(id); await _dataDictionaryRepository.DeleteAsync(id);
} }
} }

7
aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json

@ -18,9 +18,4 @@
"RoleArn": "acs:ram::1846393972471789:role/ramosstest" "RoleArn": "acs:ram::1846393972471789:role/ramosstest"
} }
} }
} }
// lion.abp@1846393972471789.onaliyun.com
//AccessKey ID LTAI5tLkt3vvScGPVZ5qKJDc
//AccessKey Secret BixV8vP5uPrbsdwjYzzsEXOPjkxPST
//acs:ram::1846393972471789:role/ramosstest

2
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs

@ -55,7 +55,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
await SendMessageToAllClientAsync(new SendNotificationDto(title, content, messageType)); await SendMessageToAllClientAsync(new SendNotificationDto(title, content, messageType));
break; break;
default: default:
throw new UserFriendlyException("未知的消息类型"); throw new BusinessException(NotificationManagementErrorCodes.MessageTypeUnknown);
} }
} }

6
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json

@ -2,6 +2,10 @@
"culture": "en", "culture": "en",
"texts": { "texts": {
"ManageYourProfile": "Manage your profile", "ManageYourProfile": "Manage your profile",
"SamplePageMessage": "A sample page for the NotificationManagement module" "SamplePageMessage": "A sample page for the NotificationManagement module",
"Lion.AbpPro.NotificationManagement:100001": "ReceiverNotNull",
"Lion.AbpPro.NotificationManagement:100002": "MessageNotExist",
"Lion.AbpPro.NotificationManagement:100003": "MessageTypeUnknown",
"Lion.AbpPro.NotificationManagement:100004": "UserUnSubscription"
} }
} }

7
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json

@ -2,6 +2,11 @@
"culture": "zh-Hans", "culture": "zh-Hans",
"texts": { "texts": {
"ManageYourProfile": "管理个人资料", "ManageYourProfile": "管理个人资料",
"SamplePageMessage": "NotificationManagement模块的示例页面" "SamplePageMessage": "NotificationManagement模块的示例页面",
"Lion.AbpPro.NotificationManagement:100001": "接收人不能为空",
"Lion.AbpPro.NotificationManagement:100002": "消息不存在",
"Lion.AbpPro.NotificationManagement:100003": "未知的消息类型",
"Lion.AbpPro.NotificationManagement:100004": "当前用户未订阅消息"
} }
} }

9
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs

@ -0,0 +1,9 @@
namespace Lion.AbpPro.NotificationManagement;
public class NotificationManagementConsts
{
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro.NotificationManagementConsts";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
}

4
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs

@ -23,14 +23,14 @@ namespace Lion.AbpPro.NotificationManagement
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<NotificationManagementResource>("en") .Add<NotificationManagementResource>(NotificationManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/NotificationManagement"); .AddVirtualJson("/Localization/NotificationManagement");
}); });
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>
{ {
options.MapCodeNamespace("NotificationManagement", typeof(NotificationManagementResource)); options.MapCodeNamespace(NotificationManagementConsts.NameSpace, typeof(NotificationManagementResource));
}); });
} }
} }

5
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs

@ -2,6 +2,9 @@ namespace Lion.AbpPro.NotificationManagement
{ {
public static class NotificationManagementErrorCodes public static class NotificationManagementErrorCodes
{ {
//Add your business exception error codes here... public const string ReceiverNotNull =NotificationManagementConsts.NameSpace+ ":100001";
public const string MessageNotExist =NotificationManagementConsts.NameSpace+ ":100002";
public const string MessageTypeUnknown =NotificationManagementConsts.NameSpace+ ":100003";
public const string UserUnSubscription =NotificationManagementConsts.NameSpace+ ":100004";
} }
} }

13
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs

@ -5,16 +5,17 @@ using Volo.Abp;
namespace Lion.AbpPro.NotificationManagement namespace Lion.AbpPro.NotificationManagement
{ {
public class NotificationManagementDomainException : UserFriendlyException public class NotificationManagementDomainException : BusinessException
{ {
public NotificationManagementDomainException(string message, string code = null, string details = null, public NotificationManagementDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException, logLevel) innerException,
logLevel
)
{ {
} }
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
base(serializationInfo, context)
{ {
} }
} }

6
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs

@ -32,7 +32,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
{ {
if (receiveIds is {Count: 0}) if (receiveIds is {Count: 0})
{ {
throw new NotificationManagementDomainException("消息接收人不能为空"); throw new NotificationManagementDomainException(NotificationManagementErrorCodes.ReceiverNotNull);
} }
var senderId = Guid.Empty; var senderId = Guid.Empty;
@ -113,7 +113,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
public async Task SetReadAsync(Guid id, Guid receiveId) public async Task SetReadAsync(Guid id, Guid receiveId)
{ {
var notification = await _notificationRepository.FindByIdAsync(id); var notification = await _notificationRepository.FindByIdAsync(id);
if (notification == null) throw new NotificationManagementDomainException(message: "消息不存在"); if (notification == null) throw new NotificationManagementDomainException(NotificationManagementErrorCodes.MessageNotExist);
if (notification.MessageType == MessageType.BroadCast) if (notification.MessageType == MessageType.BroadCast)
{ {
// 如果类型是广播消息,用户设置为已读,在插入一条数据 // 如果类型是广播消息,用户设置为已读,在插入一条数据
@ -124,7 +124,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
var notificationSubscription = var notificationSubscription =
notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId); notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId);
if (notificationSubscription == null) if (notificationSubscription == null)
throw new NotificationManagementDomainException(message: "当前用户未订阅该消息"); throw new NotificationManagementDomainException(NotificationManagementErrorCodes.UserUnSubscription);
notificationSubscription.SetRead(); notificationSubscription.SetRead();
} }

3
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs

@ -136,9 +136,6 @@ namespace Lion.AbpPro
/// <param name="context"></param> /// <param name="context"></param>
private void ConfigureAbpExceptions(ServiceConfigurationContext context) private void ConfigureAbpExceptions(ServiceConfigurationContext context)
{ {
//开启后通过ErrorCode抛本地化异常,message不会显示本地化词条
var SendExceptionsDetails = context.Services.GetHostingEnvironment().IsDevelopment();
context.Services.Configure<AbpExceptionHandlingOptions>(options => { options.SendExceptionsDetailsToClients = SendExceptionsDetails; });
context.Services.AddMvc(options => { options.Filters.Add(typeof(ResultExceptionFilter)); }); context.Services.AddMvc(options => { options.Filters.Add(typeof(ResultExceptionFilter)); });
} }

4
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json

@ -13,7 +13,7 @@
"Hangfire": "Information", "Hangfire": "Information",
"DotNetCore.CAP": "Information", "DotNetCore.CAP": "Information",
"Serilog.AspNetCore": "Information", "Serilog.AspNetCore": "Information",
"Microsoft.EntityFrameworkCore": "Information" "Microsoft.EntityFrameworkCore": "Warning"
} }
}, },
"WriteTo": [ "WriteTo": [
@ -34,7 +34,7 @@
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100" "CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
}, },
"ConnectionStrings": { "ConnectionStrings": {
"Default": "Data Source=120.24.194.14;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}, },
"Redis": { "Redis": {
"Configuration": "localhost,password=mypassword,defaultdatabase=1" "Configuration": "localhost,password=mypassword,defaultdatabase=1"

158
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs

@ -19,55 +19,141 @@ namespace Lion.AbpPro.Permissions
abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement")); abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement"));
var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement")); var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement"));
var settingManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.Setting, L("Permission:SettingManagement")); var settingManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.Setting, L("Permission:SettingManagement"));
var organizationUnitManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.OrganizationUnit, L("Permission:OrganizationUnitManagement"));
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create,
L("Permission:Create")
);
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update,
L("Permission:Update")
);
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete,
L("Permission:Delete")
);
#region IdentityServer #region IdentityServer
// multiTenancySide: MultiTenancySides.Host 只有host租户才有权限 // multiTenancySide: MultiTenancySides.Host 只有host租户才有权限
var identityServerManagementGroup = var identityServerManagementGroup =
context.AddGroup(AbpProPermissions.IdentityServer.IdentityServerManagement, L("Permission:IdentityServerManagement"), context.AddGroup
multiTenancySide: MultiTenancySides.Host); (
AbpProPermissions.IdentityServer.IdentityServerManagement,
L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host
);
var clientManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.Client.Default, var clientManagment = identityServerManagementGroup.AddPermission
L("Permission:IdentityServerManagement:Client"),multiTenancySide: MultiTenancySides.Host); (
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Create, AbpProPermissions.IdentityServer.Client.Default,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:Client"),
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Update, multiTenancySide: MultiTenancySides.Host
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); );
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Delete, clientManagment.AddChild
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); (
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Enable, AbpProPermissions.IdentityServer.Client.Create,
L("Permission:Enable"),multiTenancySide: MultiTenancySides.Host); L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Enable,
L("Permission:Enable"),
multiTenancySide: MultiTenancySides.Host
);
var apiResourceManagment = identityServerManagementGroup.AddPermission( var apiResourceManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.ApiResource.Default, AbpProPermissions.IdentityServer.ApiResource.Default,
L("Permission:IdentityServerManagement:ApiResource"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:ApiResource"),
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Create, multiTenancySide: MultiTenancySides.Host
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); );
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Update, apiResourceManagment.AddChild
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); (
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Delete, AbpProPermissions.IdentityServer.ApiResource.Create,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
var apiScopeManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.ApiScope.Default, var apiScopeManagment = identityServerManagementGroup.AddPermission
L("Permission:IdentityServerManagement:ApiScope"),multiTenancySide: MultiTenancySides.Host); (
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Create, AbpProPermissions.IdentityServer.ApiScope.Default,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:ApiScope"),
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Update, multiTenancySide: MultiTenancySides.Host
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); );
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Delete, apiScopeManagment.AddChild
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); (
AbpProPermissions.IdentityServer.ApiScope.Create,
L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiScope.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiScope.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
var identityResourcesManagment = identityServerManagementGroup.AddPermission( var identityResourcesManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.IdentityResources.Default, AbpProPermissions.IdentityServer.IdentityResources.Default,
L("Permission:IdentityServerManagement:IdentityResources"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:IdentityResources"),
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Create, multiTenancySide: MultiTenancySides.Host
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); );
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Update, identityResourcesManagment.AddChild
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); (
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Delete, AbpProPermissions.IdentityServer.IdentityResources.Create,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
#endregion #endregion
} }

8
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs

@ -15,6 +15,14 @@ namespace Lion.AbpPro.Permissions
public const string AuditLog = Default + ".AuditLog"; public const string AuditLog = Default + ".AuditLog";
public const string ES = Default + ".ES"; public const string ES = Default + ".ES";
public const string Setting = Default + ".Setting"; public const string Setting = Default + ".Setting";
public const string OrganizationUnit = Default + ".OrganizationUnitManagement";
public static class OrganizationUnitManagement
{
public const string Default = SystemManagement.Default + ".OrganizationUnitManagement";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
} }

74
aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Lion.AbpPro.ElasticSearchs.Dto; using Lion.AbpPro.ElasticSearchs.Dto;
using Lion.AbpPro.ElasticSearchs.Providers; using Lion.AbpPro.ElasticSearchs.Providers;
using Lion.AbpPro.Extension.Customs.Dtos; using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Extension.System;
using Lion.AbpPro.Permissions; using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@ -13,11 +14,11 @@ using Nest;
namespace Lion.AbpPro.ElasticSearchs namespace Lion.AbpPro.ElasticSearchs
{ {
[Authorize(Policy = AbpProPermissions.SystemManagement.ES)] [Authorize(Policy = AbpProPermissions.SystemManagement.ES)]
public class LionAbpProLogAppService : ElasticsearchBasicService, public class LionAbpProLogAppService : ElasticsearchBasicService,ILionAbpProLogAppService
ILionAbpProLogAppService
{ {
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
// 时区
private const string TimeZone = "Asia/Shanghai";
public LionAbpProLogAppService( public LionAbpProLogAppService(
IElasticsearchProvider elasticsearchProvider, IElasticsearchProvider elasticsearchProvider,
IConfiguration configuration) : base(elasticsearchProvider) IConfiguration configuration) : base(elasticsearchProvider)
@ -25,49 +26,54 @@ namespace Lion.AbpPro.ElasticSearchs
_configuration = configuration; _configuration = configuration;
} }
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync( public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(PagingElasticSearchLogInput input)
PagingElasticSearchLogInput input)
{ {
var IndexName = var IndexName = _configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
_configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
// 默认查询当天 // 默认查询当天
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ?? input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??DateTime.Now.Date.AddMilliseconds(-1);
DateTime.Now.Date.AddMilliseconds(-1); input.EndCreationTime =input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
input.EndCreationTime = var mustFilters = new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, QueryContainer>>();
input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ?? if (input.StartCreationTime.HasValue)
DateTime.Now.Date.AddDays(1).AddMilliseconds(-1); {
var mustFilters = input.StartCreationTime = input.StartCreationTime.ToCurrentDateMaxDateTime();
new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).GreaterThanOrEquals(input.StartCreationTime)));
QueryContainer>> }
{
t => t.DateRange(f => if (input.EndCreationTime.HasValue)
f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") {
.GreaterThanOrEquals(input.StartCreationTime.Value)), input.EndCreationTime = input.EndCreationTime.ToNextSecondDateTime();
t => t.DateRange( mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).LessThanOrEquals(input.EndCreationTime)));
f => f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") }
.LessThanOrEquals(input.EndCreationTime.Value))
};
if (!string.IsNullOrWhiteSpace(input.Filter)) if (!string.IsNullOrWhiteSpace(input.Filter))
{ {
mustFilters.Add(t => mustFilters.Add
t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))); (
t =>t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))
);
} }
var result = await Client.SearchAsync<PagingElasticSearchLogDto>(e => e var result = await Client.SearchAsync<PagingElasticSearchLogDto>
.Index(IndexName) (
.From(input.SkipCount) e => e
.Size(input.PageSize) .Index(IndexName)
.Sort(s => s.Descending(sd => sd.CreationTime)) .From(input.SkipCount)
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))); .Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))
);
if (result.HitsMetadata != null) if (result.HitsMetadata != null)
{ {
return new CustomePagedResultDto<PagingElasticSearchLogOutput>( return new CustomePagedResultDto<PagingElasticSearchLogOutput>
(
result.HitsMetadata.Total.Value, result.HitsMetadata.Total.Value,
ObjectMapper ObjectMapper
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>( .Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>
result.Documents.ToList())); (
result.Documents.ToList()
)
);
} }
return null; return null;

25
aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs

@ -3,14 +3,16 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Lion.AbpPro.Extension.Customs.Dtos; using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.IdentityServers.ApiResources.Dtos;
using Lion.AbpPro.OrganizationUnits.Dto; using Lion.AbpPro.OrganizationUnits.Dto;
using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity; using Volo.Abp.Identity;
namespace Lion.AbpPro.OrganizationUnits; namespace Lion.AbpPro.OrganizationUnits;
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Default)]
public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitAppService public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitAppService
{ {
private readonly OrganizationUnitManager _organizationUnitManager; private readonly OrganizationUnitManager _organizationUnitManager;
@ -34,6 +36,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
return ConvertToTree(organizationUnitDtos); return ConvertToTree(organizationUnitDtos);
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task CreateAsync(CreateOrganizationUnitInput input) public async Task CreateAsync(CreateOrganizationUnitInput input)
{ {
var entity = new OrganizationUnit var entity = new OrganizationUnit
@ -46,11 +49,13 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
await _organizationUnitManager.CreateAsync(entity); await _organizationUnitManager.CreateAsync(entity);
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public Task DeleteAsync(IdInput input) public Task DeleteAsync(IdInput input)
{ {
return _organizationUnitManager.DeleteAsync(input.Id); return _organizationUnitManager.DeleteAsync(input.Id);
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update)]
public async Task UpdateAsync(UpdateOrganizationUnitInput input) public async Task UpdateAsync(UpdateOrganizationUnitInput input)
{ {
var entity = await _organizationUnitRepository.FindAsync(input.Id); var entity = await _organizationUnitRepository.FindAsync(input.Id);
@ -61,6 +66,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
} }
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input) public async Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input)
{ {
foreach (var roleId in input.RoleId) foreach (var roleId in input.RoleId)
@ -69,11 +75,13 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
} }
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public async Task RemoveRoleFromOrganizationUnitAsync(RemoveRoleToOrganizationUnitInput input) public async Task RemoveRoleFromOrganizationUnitAsync(RemoveRoleToOrganizationUnitInput input)
{ {
await _organizationUnitManager.RemoveRoleFromOrganizationUnitAsync(input.RoleId, input.OrganizationUnitId); await _organizationUnitManager.RemoveRoleFromOrganizationUnitAsync(input.RoleId, input.OrganizationUnitId);
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input) public async Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input)
{ {
foreach (var userId in input.UserId) foreach (var userId in input.UserId)
@ -82,6 +90,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
} }
} }
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public async Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input) public async Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input)
{ {
await _identityUserManager.RemoveFromOrganizationUnitAsync(input.UserId, input.OrganizationUnitId); await _identityUserManager.RemoveFromOrganizationUnitAsync(input.UserId, input.OrganizationUnitId);
@ -91,7 +100,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{ {
var listResult = new List<GetOrganizationUnitUserOutput>(); var listResult = new List<GetOrganizationUnitUserOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetMembersCountAsync(organizationUnit, filter: input.Filter); var count = await _organizationUnitRepository.GetMembersCountAsync(organizationUnit, filter: input.Filter);
if (count > 0) if (count > 0)
@ -113,7 +122,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{ {
var listResult = new List<GetUnAddUserOutput>(); var listResult = new List<GetUnAddUserOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetUnaddedUsersCountAsync(organizationUnit, input.Filter); var count = await _organizationUnitRepository.GetUnaddedUsersCountAsync(organizationUnit, input.Filter);
if (count > 0) if (count > 0)
{ {
@ -134,7 +143,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{ {
var listResult = new List<GetOrganizationUnitRoleOutput>(); var listResult = new List<GetOrganizationUnitRoleOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetRolesCountAsync(organizationUnit); var count = await _organizationUnitRepository.GetRolesCountAsync(organizationUnit);
if (count > 0) if (count > 0)
@ -150,7 +159,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{ {
var listResult = new List<GetUnAddRoleOutput>(); var listResult = new List<GetUnAddRoleOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetUnaddedRolesCountAsync(organizationUnit, input.Filter); var count = await _organizationUnitRepository.GetUnaddedRolesCountAsync(organizationUnit, input.Filter);
if (count > 0) if (count > 0)
{ {
@ -169,7 +178,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
#region 私有方法 #region 私有方法
private List<TreeOutput> ConvertToTree(List<OrganizationUnitDto> list, private List<TreeOutput> ConvertToTree(
List<OrganizationUnitDto> list,
Guid? Id = null) Guid? Id = null)
{ {
var result = new List<TreeOutput>(); var result = new List<TreeOutput>();
@ -188,7 +198,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
return result; return result;
} }
private List<OrganizationUnitDto> Children(List<OrganizationUnitDto> list, private List<OrganizationUnitDto> Children(
List<OrganizationUnitDto> list,
Guid? Id) Guid? Id)
{ {
var childList = list.Where(x => x.ParentId == Id).ToList(); var childList = list.Where(x => x.ParentId == Id).ToList();

16
aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs

@ -10,10 +10,12 @@ using Lion.AbpPro.ConfigurationOptions;
using Lion.AbpPro.Users.Dtos; using Lion.AbpPro.Users.Dtos;
using IdentityModel; using IdentityModel;
using Lion.AbpPro.Extension.Customs.Http; using Lion.AbpPro.Extension.Customs.Http;
using Lion.AbpPro.NotificationManagement.Notifications;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Authorization;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Security.Claims; using Volo.Abp.Security.Claims;
@ -28,7 +30,7 @@ namespace Lion.AbpPro.Users
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuretion; private readonly IConfiguration _configuretion;
private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository; private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository;
public AccountAppService( public AccountAppService(
IdentityUserManager userManager, IdentityUserManager userManager,
IOptionsSnapshot<JwtOptions> jwtOptions, IOptionsSnapshot<JwtOptions> jwtOptions,
@ -51,12 +53,12 @@ namespace Lion.AbpPro.Users
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
if (result.IsNotAllowed) if (result.IsNotAllowed)
{ {
throw new UserFriendlyException("当前用户已锁定"); throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
} }
if (!result.Succeeded) if (!result.Succeeded)
{ {
throw new UserFriendlyException("用户名或者密码错误"); throw new BusinessException(AbpProDomainErrorCodes.UserOrPasswordMismatch);
} }
var user = await _userManager.FindByNameAsync(input.Name); var user = await _userManager.FindByNameAsync(input.Name);
@ -76,7 +78,7 @@ namespace Lion.AbpPro.Users
var user = await _userManager.FindByNameAsync(response.name); var user = await _userManager.FindByNameAsync(response.name);
if (!user.IsActive) if (!user.IsActive)
{ {
throw new UserFriendlyException("当前用户已锁定"); throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
} }
return await BuildResult(user); return await BuildResult(user);
@ -115,7 +117,7 @@ namespace Lion.AbpPro.Users
{ {
var result = new LoginOutput(); var result = new LoginOutput();
var roles = await _identityRoleRepository.GetListAsync(e => e.IsDefault); var roles = await _identityRoleRepository.GetListAsync(e => e.IsDefault);
if (roles == null || roles.Count == 0) throw new UserFriendlyException("系统未配置默认角色"); if (roles == null || roles.Count == 0) throw new AbpAuthorizationException();
var userId = GuidGenerator.Create(); var userId = GuidGenerator.Create();
var user = new IdentityUser(userId, userName, email) var user = new IdentityUser(userId, userName, email)
@ -138,9 +140,9 @@ namespace Lion.AbpPro.Users
private async Task<LoginOutput> BuildResult(IdentityUser user) private async Task<LoginOutput> BuildResult(IdentityUser user)
{ {
if (!user.IsActive) throw new UserFriendlyException("当前用户已被锁定"); if (!user.IsActive) throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
var roles = await _userManager.GetRolesAsync(user); var roles = await _userManager.GetRolesAsync(user);
if (roles == null || roles.Count == 0) throw new UserFriendlyException("当前用户未分配角色"); if (roles == null || roles.Count == 0) throw new AbpAuthorizationException();
var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email, var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email,
user.TenantId.ToString(), roles.ToList()); user.TenantId.ToString(), roles.ToList());
var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user); var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user);

5
aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs

@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Lion.AbpPro.Users.Dtos; using Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos; using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.NotificationManagement.Notifications;
using Lion.AbpPro.Permissions; using Lion.AbpPro.Permissions;
using Magicodes.ExporterAndImporter.Excel; using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Excel.AspNetCore; using Magicodes.ExporterAndImporter.Excel.AspNetCore;
@ -27,13 +28,13 @@ namespace Lion.AbpPro.Users
private readonly IIdentityUserRepository _identityUserRepository; private readonly IIdentityUserRepository _identityUserRepository;
private readonly IExcelExporter _excelExporter; private readonly IExcelExporter _excelExporter;
private readonly IOptions<IdentityOptions> _options; private readonly IOptions<IdentityOptions> _options;
public UserAppService( public UserAppService(
IIdentityUserAppService identityUserAppService, IIdentityUserAppService identityUserAppService,
IdentityUserManager userManager, IdentityUserManager userManager,
IIdentityUserRepository userRepository, IIdentityUserRepository userRepository,
IExcelExporter excelExporter, IExcelExporter excelExporter,
IOptions<IdentityOptions> options) IOptions<IdentityOptions> options,
NotificationManager notificationManager)
{ {
_identityUserAppService = identityUserAppService; _identityUserAppService = identityUserAppService;
_userManager = userManager; _userManager = userManager;

10
aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs

@ -1,3 +1,4 @@
using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -12,24 +13,23 @@ namespace Lion.AbpPro.DbMigrator
public class DbMigratorHostedService : IHostedService public class DbMigratorHostedService : IHostedService
{ {
private readonly IHostApplicationLifetime _hostApplicationLifetime; private readonly IHostApplicationLifetime _hostApplicationLifetime;
private readonly IConfigurationRoot _configurationRoot; private readonly IConfiguration _configuration;
public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime,
IConfigurationRoot configurationRoot) IConfiguration configuration)
{ {
_hostApplicationLifetime = hostApplicationLifetime; _hostApplicationLifetime = hostApplicationLifetime;
_configurationRoot = configurationRoot; _configuration = configuration;
} }
public async Task StartAsync(CancellationToken cancellationToken) public async Task StartAsync(CancellationToken cancellationToken)
{ {
using (var application = await AbpApplicationFactory.CreateAsync<AbpProDbMigratorModule>(options => using (var application = await AbpApplicationFactory.CreateAsync<AbpProDbMigratorModule>(options =>
{ {
options.Services.ReplaceConfiguration(_configuration);
options.UseAutofac(); options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog()); options.Services.AddLogging(c => c.AddSerilog());
})) }))
{ {
var s = _configurationRoot.GetValue<string>("ConnectionStrings:Default");
await application.InitializeAsync(); await application.InitializeAsync();
await application await application

19
aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj

@ -7,22 +7,6 @@
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Remove="appsettings.json" />
</ItemGroup>
<ItemGroup>
<Content Include="appsettings.Production.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="appsettings.Staging.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsLoggingVersion)" /> <PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsLoggingVersion)" />
<PackageReference Include="Serilog.Sinks.Async" Version="$(SerilogSinksAsyncVersion)" /> <PackageReference Include="Serilog.Sinks.Async" Version="$(SerilogSinksAsyncVersion)" />
@ -42,6 +26,9 @@
<Content Remove="Logs\**" /> <Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" /> <EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" /> <None Remove="Logs\**" />
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

13
aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs

@ -34,21 +34,8 @@ namespace Lion.AbpPro.DbMigrator
public static IHostBuilder CreateHostBuilder(string[] args) => public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args) Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, logging) => logging.ClearProviders()) .ConfigureLogging((context, logging) => logging.ClearProviders())
.ConfigureAppConfiguration(otpions =>
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Console.WriteLine($"ASPNETCORE_ENVIRONMENT:{environment}");
var appSettingFileName = "appsettings.json";
if (!environment.IsNullOrWhiteSpace())
appSettingFileName = $"appsettings.{environment}.json";
Console.WriteLine($"appSettingFileName:{appSettingFileName}");
otpions.AddJsonFile(appSettingFileName,optional:false);
})
.ConfigureServices((hostContext, services) => .ConfigureServices((hostContext, services) =>
{ {
var s = hostContext.HostingEnvironment;
var _configurationRoot= services.GetRequiredService<IConfigurationRoot>();
var ss = _configurationRoot.GetValue<string>("ConnectionStrings:Default");
services.AddHostedService<DbMigratorHostedService>(); services.AddHostedService<DbMigratorHostedService>();
}); });
} }

5
aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json

@ -1,5 +0,0 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Database=LionAbpProDB123123;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}

5
aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json

@ -1,5 +0,0 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Database=LionAbpProDB123123Staging;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}

5
aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json

@ -0,0 +1,5 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}

5
aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json

@ -1,5 +0,0 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}

12
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs

@ -2,6 +2,16 @@ namespace Lion.AbpPro
{ {
public static class AbpProDomainErrorCodes public static class AbpProDomainErrorCodes
{ {
/* You can add your business exception error codes here, as constants */ public const string OrganizationUnitNotExist =AbpProDomainSharedConsts.NameSpace+ ":100001";
public const string UserLockedOut =AbpProDomainSharedConsts.NameSpace+ ":100002";
public const string UserOrPasswordMismatch =AbpProDomainSharedConsts.NameSpace+ ":100003";
public const string ApiResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100004";
public const string ApiResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100005";
public const string ApiScopeNotExist =AbpProDomainSharedConsts.NameSpace+ ":100006";
public const string ApiScopeExist =AbpProDomainSharedConsts.NameSpace+ ":100007";
public const string ApiClientNotExist =AbpProDomainSharedConsts.NameSpace+ ":100008";
public const string ApiClientExist =AbpProDomainSharedConsts.NameSpace+ ":100009";
public const string IdentityResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100010";
public const string IdentityResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100011";
} }
} }

9
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs

@ -0,0 +1,9 @@
namespace Lion.AbpPro;
public class AbpProDomainSharedConsts
{
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
}

6
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs

@ -51,13 +51,13 @@ namespace Lion.AbpPro
{ {
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<AbpProDomainSharedModule>("Lion.AbpPro"); options.FileSets.AddEmbedded<AbpProDomainSharedModule>(AbpProDomainSharedConsts.NameSpace);
}); });
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<AbpProResource>("zh-Hans") .Add<AbpProResource>(AbpProDomainSharedConsts.DefaultCultureName)
.AddVirtualJson("/Localization/AbpPro") .AddVirtualJson("/Localization/AbpPro")
.AddBaseTypes(typeof(IdentityResource)) .AddBaseTypes(typeof(IdentityResource))
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
@ -70,7 +70,7 @@ namespace Lion.AbpPro
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>
{ {
options.MapCodeNamespace("AbpPro", typeof(AbpProResource)); options.MapCodeNamespace(AbpProDomainSharedConsts.NameSpace, typeof(AbpProResource));
}); });
} }

16
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json

@ -17,6 +17,7 @@
"Permission:CapManagement": "IntegratedEvent", "Permission:CapManagement": "IntegratedEvent",
"Permission:ESManagement": "ESManagement", "Permission:ESManagement": "ESManagement",
"Permission:SettingManagement": "SettingManagement", "Permission:SettingManagement": "SettingManagement",
"Permission:OrganizationUnitManagement": "OrganizationUnitManagement",
"Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "Client", "Permission:IdentityServerManagement:Client": "Client",
"Permission:IdentityServerManagement:ApiResource": "ApiResource", "Permission:IdentityServerManagement:ApiResource": "ApiResource",
@ -28,6 +29,19 @@
"Description:Setting.Group.Other.Github": "Github", "Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"Created", "Enum:TestType:Created:1":"Created",
"Enum:TestType:Cancel:1":"Cancel", "Enum:TestType:Cancel:1":"Cancel",
"Enum:TestType:Delete:1":"Delete" "Enum:TestType:Delete:1":"Delete",
"Lion.AbpPro:100001": "OrganizationUnit Not Exist",
"Lion.AbpPro:100002": "UserLockedOut",
"Lion.AbpPro:100003": "UserOrPasswordMismatch",
"Lion.AbpPro:100004": "ApiResource Not Exist",
"Lion.AbpPro:100005": "ApiResource Exist",
"Lion.AbpPro:100006": "ApiScope Not Exist",
"Lion.AbpPro:100007": "ApiScope Exist",
"Lion.AbpPro:100008": "ApiClient Not Exist",
"Lion.AbpPro:100009": "ApiClient Exist",
"Lion.AbpPro:100010": "IdentityResource Not Exist",
"Lion.AbpPro:100011": "IdentityResource Exist"
} }
} }

15
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json

@ -17,6 +17,7 @@
"Permission:CapManagement": "集成事件", "Permission:CapManagement": "集成事件",
"Permission:ESManagement": "ES日志", "Permission:ESManagement": "ES日志",
"Permission:SettingManagement": "设置管理", "Permission:SettingManagement": "设置管理",
"Permission:OrganizationUnitManagement": "组织结构管理",
"Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "客户端", "Permission:IdentityServerManagement:Client": "客户端",
"Permission:IdentityServerManagement:ApiResource": "Api资源", "Permission:IdentityServerManagement:ApiResource": "Api资源",
@ -28,6 +29,18 @@
"Description:Setting.Group.Other.Github": "Github", "Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"创建", "Enum:TestType:Created:1":"创建",
"Enum:TestType:Cancel:1":"取消", "Enum:TestType:Cancel:1":"取消",
"Enum:TestType:Delete:1":"删除" "Enum:TestType:Delete:1":"删除",
"Lion.AbpPro:100001": "组织机构不存在",
"Lion.AbpPro:100002": "用户被锁定",
"Lion.AbpPro:100003": "用户名或者密码错误",
"Lion.AbpPro:100004": "ApiResource不存在",
"Lion.AbpPro:100005": "ApiResource 已存在",
"Lion.AbpPro:100006": "ApiScope 不存在",
"Lion.AbpPro:100007": "ApiScope 已存在",
"Lion.AbpPro:100008": "ApiClient 不存在",
"Lion.AbpPro:100009": "ApiClient 已存在",
"Lion.AbpPro:100010": "IdentityResource 不存在",
"Lion.AbpPro:100011": "IdentityResource 已存在"
} }
} }

2
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs

@ -1,6 +1,6 @@
using Volo.Abp.Localization; using Volo.Abp.Localization;
namespace Lion.AbpPro.Localization namespace Lion.AbpPro
{ {
[LocalizationResourceName("AbpPro")] [LocalizationResourceName("AbpPro")]
public class AbpProResource public class AbpProResource

291
aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -13,207 +13,208 @@ using Volo.Abp.Identity;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.TenantManagement; using Volo.Abp.TenantManagement;
namespace Lion.AbpPro.Data; namespace Lion.AbpPro.Data
public class AbpProDbMigrationService : ITransientDependency
{ {
public ILogger<AbpProDbMigrationService> Logger { get; set; } public class AbpProDbMigrationService : ITransientDependency
private readonly IDataSeeder _dataSeeder;
private readonly IEnumerable<IAbpProDbSchemaMigrator> _dbSchemaMigrators;
private readonly ITenantRepository _tenantRepository;
private readonly ICurrentTenant _currentTenant;
public AbpProDbMigrationService(
IDataSeeder dataSeeder,
IEnumerable<IAbpProDbSchemaMigrator> dbSchemaMigrators,
ITenantRepository tenantRepository,
ICurrentTenant currentTenant)
{ {
_dataSeeder = dataSeeder; public ILogger<AbpProDbMigrationService> Logger { get; set; }
_dbSchemaMigrators = dbSchemaMigrators;
_tenantRepository = tenantRepository; private readonly IDataSeeder _dataSeeder;
_currentTenant = currentTenant; private readonly IEnumerable<IAbpProDbSchemaMigrator> _dbSchemaMigrators;
private readonly ITenantRepository _tenantRepository;
Logger = NullLogger<AbpProDbMigrationService>.Instance; private readonly ICurrentTenant _currentTenant;
}
public AbpProDbMigrationService(
IDataSeeder dataSeeder,
IEnumerable<IAbpProDbSchemaMigrator> dbSchemaMigrators,
ITenantRepository tenantRepository,
ICurrentTenant currentTenant)
{
_dataSeeder = dataSeeder;
_dbSchemaMigrators = dbSchemaMigrators;
_tenantRepository = tenantRepository;
_currentTenant = currentTenant;
public async Task MigrateAsync() Logger = NullLogger<AbpProDbMigrationService>.Instance;
{ }
var initialMigrationAdded = AddInitialMigrationIfNotExist();
if (initialMigrationAdded) public async Task MigrateAsync()
{ {
return; var initialMigrationAdded = AddInitialMigrationIfNotExist();
}
Logger.LogInformation("Started database migrations..."); if (initialMigrationAdded)
{
return;
}
await MigrateDatabaseSchemaAsync(); Logger.LogInformation("Started database migrations...");
await SeedDataAsync();
Logger.LogInformation($"Successfully completed host database migrations."); await MigrateDatabaseSchemaAsync();
await SeedDataAsync();
var tenants = await _tenantRepository.GetListAsync(includeDetails: true); Logger.LogInformation($"Successfully completed host database migrations.");
var migratedDatabaseSchemas = new HashSet<string>(); var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
foreach (var tenant in tenants)
{ var migratedDatabaseSchemas = new HashSet<string>();
using (_currentTenant.Change(tenant.Id)) foreach (var tenant in tenants)
{ {
if (tenant.ConnectionStrings.Any()) using (_currentTenant.Change(tenant.Id))
{ {
var tenantConnectionStrings = tenant.ConnectionStrings if (tenant.ConnectionStrings.Any())
.Select(x => x.Value)
.ToList();
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
{ {
await MigrateDatabaseSchemaAsync(tenant); var tenantConnectionStrings = tenant.ConnectionStrings
.Select(x => x.Value)
.ToList();
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
{
await MigrateDatabaseSchemaAsync(tenant);
migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings);
}
} }
await SeedDataAsync(tenant);
} }
await SeedDataAsync(tenant); Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations.");
} }
Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); Logger.LogInformation("Successfully completed all database migrations.");
Logger.LogInformation("You can safely end this process...");
} }
Logger.LogInformation("Successfully completed all database migrations."); private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null)
Logger.LogInformation("You can safely end this process...");
}
private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null)
{
Logger.LogInformation(
$"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database...");
foreach (var migrator in _dbSchemaMigrators)
{ {
await migrator.MigrateAsync(); Logger.LogInformation(
$"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database...");
foreach (var migrator in _dbSchemaMigrators)
{
await migrator.MigrateAsync();
}
} }
}
private async Task SeedDataAsync(Tenant tenant = null) private async Task SeedDataAsync(Tenant tenant = null)
{ {
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
); );
} }
private bool AddInitialMigrationIfNotExist() private bool AddInitialMigrationIfNotExist()
{
try
{ {
if (!DbMigrationsProjectExists()) try
{
if (!DbMigrationsProjectExists())
{
return false;
}
}
catch (Exception)
{ {
return false; return false;
} }
}
catch (Exception)
{
return false;
}
try try
{
if (!MigrationsFolderExists())
{ {
AddInitialMigration(); if (!MigrationsFolderExists())
return true; {
AddInitialMigration();
return true;
}
else
{
return false;
}
} }
else catch (Exception e)
{ {
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
return false; return false;
} }
} }
catch (Exception e)
{
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
return false;
}
}
private bool DbMigrationsProjectExists() private bool DbMigrationsProjectExists()
{ {
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath();
return dbMigrationsProjectFolder != null; return dbMigrationsProjectFolder != null;
} }
private bool MigrationsFolderExists() private bool MigrationsFolderExists()
{ {
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath();
return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "EntityFrameworkCore"));
} }
private void AddInitialMigration() private void AddInitialMigration()
{ {
Logger.LogInformation("Creating initial migration..."); Logger.LogInformation("Creating initial migration...");
string argumentPrefix; string argumentPrefix;
string fileName; string fileName;
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{ {
argumentPrefix = "-c"; argumentPrefix = "-c";
fileName = "/bin/bash"; fileName = "/bin/bash";
} }
else else
{ {
argumentPrefix = "/C"; argumentPrefix = "/C";
fileName = "cmd.exe"; fileName = "cmd.exe";
} }
var procStartInfo = new ProcessStartInfo(fileName, var procStartInfo = new ProcessStartInfo(fileName,
$"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetDbMigrationsProjectFolderPath()}\"\""
); );
try try
{ {
Process.Start(procStartInfo); Process.Start(procStartInfo);
} }
catch (Exception) catch (Exception)
{ {
throw new Exception("Couldn't run ABP CLI..."); throw new Exception("Couldn't run ABP CLI...");
}
} }
}
private string GetEntityFrameworkCoreProjectFolderPath() private string GetDbMigrationsProjectFolderPath()
{
var slnDirectoryPath = GetSolutionDirectoryPath();
if (slnDirectoryPath == null)
{ {
throw new Exception("Solution folder not found!"); var slnDirectoryPath = GetSolutionDirectoryPath();
}
var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); if (slnDirectoryPath == null)
{
throw new Exception("Solution folder not found!");
}
return Directory.GetDirectories(srcDirectoryPath) var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src");
.FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore"));
}
private string GetSolutionDirectoryPath() return Directory.GetDirectories(srcDirectoryPath)
{ .FirstOrDefault(d => d.EndsWith(".DbMigrations"));
var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); }
while (Directory.GetParent(currentDirectory.FullName) != null) private string GetSolutionDirectoryPath()
{ {
currentDirectory = Directory.GetParent(currentDirectory.FullName); var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());
if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) while (Directory.GetParent(currentDirectory.FullName) != null)
{ {
return currentDirectory.FullName; currentDirectory = Directory.GetParent(currentDirectory.FullName);
if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null)
{
return currentDirectory.FullName;
}
} }
}
return null; return null;
}
} }
} }

11
aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs

@ -1,8 +1,9 @@
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Lion.AbpPro.Data; namespace Lion.AbpPro.Data
public interface IAbpProDbSchemaMigrator
{ {
Task MigrateAsync(); public interface IAbpProDbSchemaMigrator
{
Task MigrateAsync();
}
} }

21
aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs

@ -1,15 +1,16 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Lion.AbpPro.Data; namespace Lion.AbpPro.Data
/* This is used if database provider does't define
* IAbpProDbSchemaMigrator implementation.
*/
public class NullAbpProDbSchemaMigrator : IAbpProDbSchemaMigrator, ITransientDependency
{ {
public Task MigrateAsync() /* This is used if database provider does't define
* IAbpProDbSchemaMigrator implementation.
*/
public class NullAbpProDbSchemaMigrator : IAbpProDbSchemaMigrator, ITransientDependency
{ {
return Task.CompletedTask; public Task MigrateAsync()
{
return Task.CompletedTask;
}
} }
} }

50
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs

@ -26,17 +26,26 @@ namespace Lion.AbpPro.IdentityServer
bool includeDetails = false, bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiResourceRepository.GetListAsync("CreationTime desc", skipCount, return _apiResourceRepository.GetListAsync
maxResultCount, filter, (
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails, includeDetails,
cancellationToken); cancellationToken
);
} }
public Task<long> GetCountAsync(string filter = null, public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiResourceRepository.GetCountAsync(filter, return _apiResourceRepository.GetCountAsync
cancellationToken); (
filter,
cancellationToken
);
} }
/// <summary> /// <summary>
@ -65,10 +74,16 @@ namespace Lion.AbpPro.IdentityServer
await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken); await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken);
if (null != apiResource) if (null != apiResource)
{ {
throw new UserFriendlyException(message: "ApiResource已存在"); throw new BusinessException(AbpProDomainErrorCodes.ApiResourceExist);
} }
apiResource = new ApiResource(id, name, displayName, description) apiResource = new ApiResource
(
id,
name,
displayName,
description
)
{ {
AllowedAccessTokenSigningAlgorithms = allowedAccessTokenSigningAlgorithms, AllowedAccessTokenSigningAlgorithms = allowedAccessTokenSigningAlgorithms,
ShowInDiscoveryDocument = showInDiscoveryDocument, ShowInDiscoveryDocument = showInDiscoveryDocument,
@ -83,8 +98,11 @@ namespace Lion.AbpPro.IdentityServer
// //
// properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); }); // properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); });
return await _apiResourceRepository.InsertAsync(apiResource, return await _apiResourceRepository.InsertAsync
cancellationToken: cancellationToken); (
apiResource,
cancellationToken: cancellationToken
);
} }
public async Task DeleteAsync( public async Task DeleteAsync(
@ -104,14 +122,13 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument, bool showInDiscoveryDocument,
string secret, string secret,
List<string> scopes, List<string> scopes,
CancellationToken cancellationToken = default CancellationToken cancellationToken = default)
)
{ {
var apiResource = var apiResource =
await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken); await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken);
if (null == apiResource) if (null == apiResource)
{ {
throw new UserFriendlyException(message: "ApiResource不存在"); throw new BusinessException(AbpProDomainErrorCodes.ApiResourceNotExist);
} }
apiResource.DisplayName = displayName; apiResource.DisplayName = displayName;
@ -148,8 +165,11 @@ namespace Lion.AbpPro.IdentityServer
} }
return await _apiResourceRepository.UpdateAsync(apiResource, return await _apiResourceRepository.UpdateAsync
cancellationToken: cancellationToken); (
apiResource,
cancellationToken: cancellationToken
);
} }
} }
} }

46
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs

@ -23,16 +23,19 @@ namespace Lion.AbpPro.IdentityServer
bool includeDetails = false, bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.GetListAsync( return _apiScopeRepository.GetListAsync
(
"CreationTime desc", "CreationTime desc",
skipCount, skipCount,
maxResultCount, maxResultCount,
filter, filter,
includeDetails, includeDetails,
cancellationToken); cancellationToken
);
} }
public Task<long> GetCountAsync(string filter = null, public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.GetCountAsync(filter, cancellationToken); return _apiScopeRepository.GetCountAsync(filter, cancellationToken);
@ -48,11 +51,19 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var apiScopes = await _apiScopeRepository.GetListByNameAsync(new[] { name }, false); var apiScopes = await _apiScopeRepository.GetListByNameAsync(new[] { name }, false);
if (apiScopes.Count > 0) throw new UserFriendlyException(message: $"{name}已存在"); if (apiScopes.Count > 0) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeExist);
var scope = new ApiScope(GuidGenerator.Create(), name, displayName, description, var scope = new ApiScope
required, emphasize, (
showInDiscoveryDocument, enabled); GuidGenerator.Create(),
name,
displayName,
description,
required,
emphasize,
showInDiscoveryDocument,
enabled
);
return await _apiScopeRepository.InsertAsync(scope); return await _apiScopeRepository.InsertAsync(scope);
} }
@ -67,7 +78,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var apiScope = await _apiScopeRepository.FindAsync(id, false); var apiScope = await _apiScopeRepository.FindAsync(id, false);
if (null == apiScope) throw new UserFriendlyException(message: $"{name}不存在"); if (null == apiScope) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeNotExist);
apiScope.DisplayName = displayName; apiScope.DisplayName = displayName;
apiScope.Description = description; apiScope.Description = description;
apiScope.Enabled = enabled; apiScope.Enabled = enabled;
@ -77,18 +88,25 @@ namespace Lion.AbpPro.IdentityServer
return await _apiScopeRepository.UpdateAsync(apiScope); return await _apiScopeRepository.UpdateAsync(apiScope);
} }
public Task DeleteAsync(Guid id, bool autoSave = false, public Task DeleteAsync(
Guid id,
bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken); return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken);
} }
public async Task<List<ApiScope>> FindAllAsync( public async Task<List<ApiScope>> FindAllAsync(CancellationToken cancellationToken = default)
CancellationToken cancellationToken = default)
{ {
return await _apiScopeRepository.GetListAsync("CreationTime desc", 0, Int32.MaxValue, return await _apiScopeRepository.GetListAsync
null, false, (
cancellationToken); "CreationTime desc",
0,
Int32.MaxValue,
null,
false,
cancellationToken
);
} }
} }
} }

20
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs

@ -50,7 +50,7 @@ namespace Lion.AbpPro.IdentityServer
string description, string allowedGrantTypes) string description, string allowedGrantTypes)
{ {
var entity = await _clientRepository.FindByClientIdAsync(clientId); var entity = await _clientRepository.FindByClientIdAsync(clientId);
if (null != entity) throw new UserFriendlyException(message: "当前ClientId已存在"); if (null != entity) throw new BusinessException(AbpProDomainErrorCodes.ApiClientExist);
entity = new Client(GuidGenerator.Create(), clientId) entity = new Client(GuidGenerator.Create(), clientId)
{ {
ClientName = clientName, Description = description, ClientName = clientName, Description = description,
@ -108,7 +108,7 @@ namespace Lion.AbpPro.IdentityServer
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) if (client == null)
{ {
throw new UserFriendlyException(message: $"{clientId}不存在"); throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
} }
client.ClientName = clientName; client.ClientName = clientName;
@ -180,7 +180,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes) public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes)
{ {
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.RemoveAllScopes(); client.RemoveAllScopes();
foreach (var item in scopes.Distinct()) foreach (var item in scopes.Distinct())
@ -201,7 +201,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim())) if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{ {
return client; return client;
@ -220,7 +220,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim())) if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{ {
client.RemoveRedirectUri(uri); client.RemoveRedirectUri(uri);
@ -239,7 +239,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri)) if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{ {
return client; return client;
@ -256,7 +256,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri)) if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{ {
client.RemovePostLogoutRedirectUri(uri); client.RemovePostLogoutRedirectUri(uri);
@ -273,7 +273,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
origin = origin.Trim(); origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.AllowedCorsOrigins.Any(e => e.Origin == origin)) if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{ {
return client; return client;
@ -292,7 +292,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
origin = origin.Trim(); origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.AllowedCorsOrigins.Any(e => e.Origin == origin)) if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{ {
client.RemoveCorsOrigin(origin); client.RemoveCorsOrigin(origin);
@ -305,7 +305,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> EnabledAsync(string clientId, bool enabled) public async Task<Client> EnabledAsync(string clientId, bool enabled)
{ {
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.Enabled = enabled; client.Enabled = enabled;
return await _clientRepository.UpdateAsync(client); return await _clientRepository.UpdateAsync(client);
} }

4
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs

@ -56,7 +56,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); var identityResource = await _identityResourceRepository.FindByNameAsync(name, false);
if (null != identityResource) throw new UserFriendlyException(message: $"{name}已存在"); if (null != identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceExist);
identityResource = new IdentityResource(GuidGenerator.Create(), name, displayName, identityResource = new IdentityResource(GuidGenerator.Create(), name, displayName,
description, enabled, description, enabled,
required, required,
@ -74,7 +74,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); var identityResource = await _identityResourceRepository.FindByNameAsync(name, false);
if (null == identityResource) throw new UserFriendlyException(message: $"{name}不存在"); if (null == identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceNotExist);
identityResource.DisplayName = displayName; identityResource.DisplayName = displayName;
identityResource.Description = description; identityResource.Description = description;
identityResource.Enabled = enabled; identityResource.Enabled = enabled;

3
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs

@ -52,11 +52,12 @@ namespace Lion.AbpPro.EntityFrameworkCore
{ {
/* The main point to change your DBMS. /* The main point to change your DBMS.
* See also AbpProMigrationsDbContextFactory for EF Core tooling. */ * See also AbpProMigrationsDbContextFactory for EF Core tooling. */
options.UseMySQL();
options.PreConfigure<AbpProDbContext>(options => options.PreConfigure<AbpProDbContext>(options =>
{ {
options.DbContextOptions.UseBatchEF_MySQLPomelo(); options.DbContextOptions.UseBatchEF_MySQLPomelo();
}); });
options.UseMySQL();
}); });
} }
} }

8
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs

@ -24,12 +24,6 @@ namespace Lion.AbpPro.EntityFrameworkCore
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var appSettingFileName = "appsettings.json";
if (!environment.IsNullOrWhiteSpace())
appSettingFileName = $"appsettings.{environment}.json";
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath .SetBasePath
( (
@ -41,7 +35,7 @@ namespace Lion.AbpPro.EntityFrameworkCore
) )
.AddJsonFile .AddJsonFile
( (
appSettingFileName, "appsettings.json",
false false
); );

3
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs

@ -12,8 +12,7 @@ namespace Lion.AbpPro.EntityFrameworkCore
{ {
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
public EntityFrameworkCoreAbpProDbSchemaMigrator( public EntityFrameworkCoreAbpProDbSchemaMigrator(IServiceProvider serviceProvider)
IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs

@ -61,11 +61,11 @@ namespace Lion.AbpPro.IdentityServer
[Fact] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = await _idenityServerApiResourceManager.CreateAsync(Guid.NewGuid(), var result = await _idenityServerApiResourceManager.CreateAsync(Guid.NewGuid(),
"ApiResource_Test", "单元测试创建", "Xunit", true, "", false, "1q2w3E*"); "ApiResource_Test", "单元测试创建", "Xunit", true, "", false, "1q2w3E*");
})).Message.ShouldBe("ApiResource已存在"); })).Code.ShouldBe(AbpProDomainErrorCodes.ApiResourceExist);
} }

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs

@ -59,11 +59,11 @@ namespace Lion.AbpPro.IdentityServer
[Fact] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = await _idenityServerApiScopeManager.CreateAsync( var result = await _idenityServerApiScopeManager.CreateAsync(
"ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true); "ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true);
})).Message.ShouldBe("ApiScope_Test已存在"); })).Code.ShouldBe(AbpProDomainErrorCodes.ApiScopeExist);
} }
// [Fact] // [Fact]

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs

@ -60,12 +60,12 @@ namespace Lion.AbpPro.IdentityServer
[Fact] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = var result =
await _idenityServerClientManager.CreateAsync("Test_Client", "XunitName", await _idenityServerClientManager.CreateAsync("Test_Client", "XunitName",
"desc", "test"); "desc", "test");
})).Message.ShouldBe("当前ClientId已存在"); })).Code.ShouldBe(AbpProDomainErrorCodes.ApiClientExist);
} }
[Fact] [Fact]

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs

@ -63,13 +63,13 @@ namespace Lion.AbpPro.IdentityServer
[Fact] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = await _identityResourceManager.CreateAsync("openid", "单元测试", var result = await _identityResourceManager.CreateAsync("openid", "单元测试",
"desc", true, false, "desc", true, false,
false, false,
false); false);
})).Message.ShouldBe("openid已存在"); })).Code.ShouldBe(AbpProDomainErrorCodes.IdentityResourceExist);
} }

20
vben271/src/router/routes/modules/admin.ts

@ -33,6 +33,16 @@ const admin: AppRouteModule = {
icon: 'ant-design:lock-outlined', icon: 'ant-design:lock-outlined',
}, },
}, },
{
path: 'organizationUnit',
name: 'organizationUnit',
component: () => import('/@/views/admin/organizationUnits/OrganizationUnit.vue'),
meta: {
title: t('routes.admin.organizationUnitManagement'),
icon: 'ant-design:gold-outlined',
policy: 'System.OrganizationUnitManagement',
},
},
{ {
path: 'settings', path: 'settings',
name: 'Settings', name: 'Settings',
@ -83,16 +93,6 @@ const admin: AppRouteModule = {
policy: 'System.FileManagement', policy: 'System.FileManagement',
}, },
}, },
{
path: 'organizationUnit',
name: 'organizationUnit',
component: () => import('/@/views/admin/organizationUnits/OrganizationUnit.vue'),
meta: {
title: t('routes.admin.organizationUnitManagement'),
icon: 'ant-design:snippets-outlined',
policy: 'System.FileManagement',
},
},
], ],
}; };

4
vben271/src/services/ServiceProxyBase.ts

@ -11,13 +11,12 @@ export class ServiceProxyBase {
options.baseURL = import.meta.env.VITE_API_URL as string; options.baseURL = import.meta.env.VITE_API_URL as string;
const guard: boolean = this.urlGuard(options.url as string); const guard: boolean = this.urlGuard(options.url as string);
const userStore = useUserStoreWithOut(); const userStore = useUserStoreWithOut();
const { token, language } = this.buildRequestMessage();
if (!guard) { if (!guard) {
if (userStore.checkUserLoginExpire) { if (userStore.checkUserLoginExpire) {
router.replace(PageEnum.BASE_LOGIN); router.replace(PageEnum.BASE_LOGIN);
return; return;
} }
const { token, language } = this.buildRequestMessage();
// 添加header // 添加header
options.headers = { options.headers = {
'accept-language': language, 'accept-language': language,
@ -29,6 +28,7 @@ export class ServiceProxyBase {
options.headers = { options.headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
__tenant: userStore.tenantId, __tenant: userStore.tenantId,
'accept-language': language,
}; };
} }

106
vben271/src/views/admin/auditLog/AuditLog.ts

@ -1,25 +1,26 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n(); const { t } = useI18n();
import moment from 'moment'; import moment from "moment";
import { AuditLogsServiceProxy, PagingAuditLogListInput } from '/@/services/ServiceProxies'; import { AuditLogsServiceProxy, PagingAuditLogListInput } from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'userName', field: "userName",
label: t('routes.admin.userManagement_userName'), label: t("routes.admin.userManagement_userName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, },
{ {
field: 'time', field: "time",
component: 'RangePicker', component: "RangePicker",
label: t('routes.admin.audit_executeTime'), label: t("routes.admin.audit_executeTime"),
colProps: { colProps: {
span: 6, span: 6
}, }
}, }
]; ];
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
@ -29,37 +30,38 @@ export const tableColumns: BasicColumn[] = [
// width: 100, // width: 100,
// }, // },
{ {
title: 'Url', title: "Url",
dataIndex: 'url', dataIndex: "url",
width: 350, width: 350,
slots: { slots: {
customRender: 'url', customRender: "url"
}, },
align: 'left', align: "left"
}, },
{ {
title: t('routes.admin.userManagement_userName'), title: t("routes.admin.userManagement_userName"),
dataIndex: 'userName', dataIndex: "userName",
width: 100, width: 100
}, },
{ {
title: t('routes.admin.executionTime'), title: t("routes.admin.executionTime"),
dataIndex: 'executionTime', dataIndex: "executionTime",
width: 200, width: 200,
customRender: ({ text }) => { customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss'); return moment(text).format("YYYY-MM-DD HH:mm:ss");
}, }
}, },
{ {
title: t('routes.admin.executionDuration'), title: t("routes.admin.executionDuration"),
dataIndex: 'executionDuration', dataIndex: "executionDuration",
width: 150, width: 150
}, },
{ {
title: 'Exceptions', title: "Exceptions",
dataIndex: 'exceptions', dataIndex: "exceptions"
}, }
]; ];
/** /**
* *
* @param params * @param params
@ -69,42 +71,44 @@ export async function getTableListAsync(params: PagingAuditLogListInput) {
const _auditLogsServiceProxy = new AuditLogsServiceProxy(); const _auditLogsServiceProxy = new AuditLogsServiceProxy();
return _auditLogsServiceProxy.page(params); return _auditLogsServiceProxy.page(params);
} }
export function httpStatusCodeColor(statusCode?: number) { export function httpStatusCodeColor(statusCode?: number) {
if (!statusCode) { if (!statusCode) {
return ''; return "";
} }
if (statusCode >= 200 && statusCode < 300) { if (statusCode >= 200 && statusCode < 300) {
return '#87d068'; return "#87d068";
} }
if (statusCode >= 300 && statusCode < 400) { if (statusCode >= 300 && statusCode < 400) {
return '#108ee9'; return "#108ee9";
} }
if (statusCode >= 400 && statusCode < 500) { if (statusCode >= 400 && statusCode < 500) {
return 'orange'; return "orange";
} }
if (statusCode >= 500) { if (statusCode >= 500) {
return 'red'; return "red";
} }
return 'cyan'; return "cyan";
} }
export function httpMethodColor(method?: string) { export function httpMethodColor(method?: string) {
if (method == 'GET') { if (method == "GET") {
return 'blue'; return "blue";
} }
if (method == 'POST') { if (method == "POST") {
return 'blue'; return "blue";
} }
if (method == 'PUT') { if (method == "PUT") {
return 'orange'; return "orange";
} }
if (method == 'DELETE') { if (method == "DELETE") {
return 'red'; return "red";
} }
if (method == 'OPTIONS') { if (method == "OPTIONS") {
return 'cyan'; return "cyan";
} }
if (method == 'PATCH') { if (method == "PATCH") {
return 'pink'; return "pink";
} }
return 'cyan'; return "cyan";
} }

89
vben271/src/views/admin/auditLog/AuditLog.vue

@ -3,9 +3,9 @@
<BasicTable @register="registerTable" size="small"> <BasicTable @register="registerTable" size="small">
<template #url="{ record }"> <template #url="{ record }">
<Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag> <Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">{{ <Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">
record.httpMethod {{ record.httpMethod }}
}}</Tag> </Tag>
<span style="margin-left: 5px">{{ record.url }}</span> <span style="margin-left: 5px">{{ record.url }}</span>
</template> </template>
</BasicTable> </BasicTable>
@ -13,46 +13,47 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicTable, useTable } from '/@/components/Table'; import { BasicTable, useTable } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync,httpStatusCodeColor,httpMethodColor } from "/@/views/admin/auditLog/AuditLog"; import { tableColumns, searchFormSchema, getTableListAsync, httpStatusCodeColor, httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from 'ant-design-vue'; import { Tag } from "ant-design-vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({
name: 'AuditLog',
components: {
BasicTable,
Tag,
},
setup() {
const { t } = useI18n();
// table
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
['time', ['executionBeginTime', 'executionEndTime'], 'YYYY-MM-DD HH:mm:ss'],
],
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
immediate: true,
scroll: { x: true },
});
return { export default defineComponent({
registerTable, name: "AuditLog",
reload, components: {
t, BasicTable,
httpStatusCodeColor, Tag
httpMethodColor, },
}; setup() {
}, const { t } = useI18n();
}); // table
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
["time", ["executionBeginTime", "executionEndTime"], "YYYY-MM-DD HH:mm:ss"]
]
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
immediate: true,
scroll: { x: true }
});
return {
registerTable,
reload,
t,
httpStatusCodeColor,
httpMethodColor
};
}
});
</script> </script>

326
vben271/src/views/admin/dictionary/AbpDictionary.ts

@ -1,39 +1,39 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { import {
PagingDataDictionaryInput, PagingDataDictionaryInput,
DataDictionaryServiceProxy, DataDictionaryServiceProxy,
SetDataDictinaryDetailInput, SetDataDictinaryDetailInput,
DeleteDataDictionaryDetailInput, DeleteDataDictionaryDetailInput,
IdInput, IdInput
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
import { h } from 'vue'; import { h } from "vue";
import { Switch } from 'ant-design-vue'; import { Switch } from "ant-design-vue";
const { t } = useI18n(); const { t } = useI18n();
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.dictionaryCode'), title: t("routes.admin.dictionaryCode"),
dataIndex: 'code', dataIndex: "code"
}, },
{ {
title: t('routes.admin.dictionaryDisplayText'), title: t("routes.admin.dictionaryDisplayText"),
dataIndex: 'displayText', dataIndex: "displayText"
}, },
{ {
title: t('routes.admin.dictionaryOrder'), title: t("routes.admin.dictionaryOrder"),
dataIndex: 'order', dataIndex: "order"
}, },
{ {
title: t('common.status'), title: t("common.status"),
dataIndex: 'isEnabled', dataIndex: "isEnabled",
customRender: ({ record }) => { customRender: ({ record }) => {
return h(Switch, { return h(Switch, {
checked: record.isEnabled, checked: record.isEnabled,
checkedChildren: '是', checkedChildren: "是",
unCheckedChildren: '否', unCheckedChildren: "否",
onChange(checked: boolean) { onChange(checked: boolean) {
const request = new SetDataDictinaryDetailInput(); const request = new SetDataDictinaryDetailInput();
request.dataDictionaryId = record.dataDictionaryId; request.dataDictionaryId = record.dataDictionaryId;
@ -42,102 +42,102 @@ export const tableColumns: BasicColumn[] = [
enableDictionaryAsync(request) enableDictionaryAsync(request)
.then(() => { .then(() => {
record.isEnabled = checked; record.isEnabled = checked;
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
}) })
.catch(() => { .catch(() => {
message.error(t('common.operationFail')); message.error(t("common.operationFail"));
}); });
}, }
}); });
}, }
}, },
{ {
dataIndex: 'description', dataIndex: "description",
title: t('routes.admin.dictionaryDescription'), title: t("routes.admin.dictionaryDescription")
}, }
]; ];
//字典类型表格 //字典类型表格
export const dictionaryTypeTableColumns: BasicColumn[] = [ export const dictionaryTypeTableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.dictionaryCode') + '|' + t('routes.admin.dictionaryDisplayText'), title: t("routes.admin.dictionaryCode") + "|" + t("routes.admin.dictionaryDisplayText"),
dataIndex: 'text', dataIndex: "text",
align: 'left', align: "left",
slots: { slots: {
customRender: 'text', customRender: "text"
}, }
}, }
]; ];
//字典项查询 //字典项查询
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: '', label: "",
component: 'Input', component: "Input",
colProps: { colProps: {
span: 6, span: 6
}, }
}, }
]; ];
//字典类型查询 //字典类型查询
export const searchDictionaryFormSchema: FormSchema[] = [ export const searchDictionaryFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: '', label: "",
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, }
]; ];
//新增字典项 //新增字典项
export const createFormSchema: FormSchema[] = [ export const createFormSchema: FormSchema[] = [
{ {
field: 'id', field: "id",
label: '', label: "",
ifShow: false, ifShow: false,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'typeDisplayText', field: "typeDisplayText",
label: t('routes.admin.dictionaryTypeName'), label: t("routes.admin.dictionaryTypeName"),
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, },
componentProps: { componentProps: {
disabled: true, disabled: true
}, }
}, },
{ {
field: 'code', field: "code",
label: t('routes.admin.dictionaryCode'), label: t("routes.admin.dictionaryCode"),
required: true, required: true,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'displayText', field: "displayText",
label: t('routes.admin.dictionaryDisplayText'), label: t("routes.admin.dictionaryDisplayText"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'order', field: "order",
label: t('routes.admin.dictionaryOrder'), label: t("routes.admin.dictionaryOrder"),
required: true, required: true,
component: 'InputNumber', component: "InputNumber",
colProps: { colProps: {
span: 18, span: 18
}, },
dynamicRules: () => { dynamicRules: () => {
return [ return [
@ -148,69 +148,69 @@ export const createFormSchema: FormSchema[] = [
if (regNull.test(value)) { if (regNull.test(value)) {
return Promise.resolve(); return Promise.resolve();
} }
return Promise.reject(t('routes.admin.nonZeroMessage')); return Promise.reject(t("routes.admin.nonZeroMessage"));
}, }
}, }
]; ];
}, }
}, },
{ {
field: 'description', field: "description",
label: t('routes.admin.dictionaryDescription'), label: t("routes.admin.dictionaryDescription"),
component: 'InputTextArea', component: "InputTextArea",
colProps: { colProps: {
span: 18, span: 18
}, }
}, }
]; ];
//编辑字典项 //编辑字典项
export const editFormSchema: FormSchema[] = [ export const editFormSchema: FormSchema[] = [
{ {
field: 'dataDictionaryId', field: "dataDictionaryId",
label: '', label: "",
ifShow: false, ifShow: false,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'id', field: "id",
label: '', label: "",
ifShow: false, ifShow: false,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'code', field: "code",
label: t('routes.admin.dictionaryCode'), label: t("routes.admin.dictionaryCode"),
required: true, required: true,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, },
componentProps: { componentProps: {
disabled: true, disabled: true
}, }
}, },
{ {
field: 'displayText', field: "displayText",
label: t('routes.admin.dictionaryDisplayText'), label: t("routes.admin.dictionaryDisplayText"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'order', field: "order",
label: t('routes.admin.dictionaryOrder'), label: t("routes.admin.dictionaryOrder"),
required: true, required: true,
component: 'InputNumber', component: "InputNumber",
colProps: { colProps: {
span: 18, span: 18
}, },
dynamicRules: () => { dynamicRules: () => {
return [ return [
@ -221,99 +221,99 @@ export const editFormSchema: FormSchema[] = [
if (regNull.test(value)) { if (regNull.test(value)) {
return Promise.resolve(); return Promise.resolve();
} }
return Promise.reject(t('routes.admin.nonZeroMessage')); return Promise.reject(t("routes.admin.nonZeroMessage"));
}, }
}, }
]; ];
}, }
}, },
{ {
field: 'description', field: "description",
label: t('routes.admin.dictionaryDescription'), label: t("routes.admin.dictionaryDescription"),
component: 'InputTextArea', component: "InputTextArea",
colProps: { colProps: {
span: 18, span: 18
}, }
}, }
]; ];
//新增字典类型 //新增字典类型
export const createDictionaryTypeFormSchema: FormSchema[] = [ export const createDictionaryTypeFormSchema: FormSchema[] = [
{ {
field: 'code', field: "code",
label: t('routes.admin.dictionaryCode'), label: t("routes.admin.dictionaryCode"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 22, span: 22
}, }
}, },
{ {
field: 'displayText', field: "displayText",
label: t('routes.admin.dictionaryDisplayText'), label: t("routes.admin.dictionaryDisplayText"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 22, span: 22
}, }
}, },
{ {
field: 'description', field: "description",
label: t('routes.admin.dictionaryDescription'), label: t("routes.admin.dictionaryDescription"),
component: 'InputTextArea', component: "InputTextArea",
colProps: { colProps: {
span: 22, span: 22
}, }
}, }
]; ];
//编辑字典类型 //编辑字典类型
export const editDictionaryTypeFormSchema: FormSchema[] = [ export const editDictionaryTypeFormSchema: FormSchema[] = [
{ {
field: 'code', field: "code",
label: t('routes.admin.dictionaryCode'), label: t("routes.admin.dictionaryCode"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 22, span: 22
}, },
componentProps: { componentProps: {
disabled: true, disabled: true
}, }
}, },
{ {
field: 'displayText', field: "displayText",
label: t('routes.admin.dictionaryDisplayText'), label: t("routes.admin.dictionaryDisplayText"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { colProps: {
span: 22, span: 22
}, }
}, },
{ {
field: 'description', field: "description",
label: t('routes.admin.dictionaryDescription'), label: t("routes.admin.dictionaryDescription"),
component: 'InputTextArea', component: "InputTextArea",
colProps: { colProps: {
span: 22, span: 22
}, }
}, },
{ {
field: 'key', field: "key",
label: '', label: "",
ifShow: false, ifShow: false,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'id', field: "id",
label: '', label: "",
ifShow: false, ifShow: false,
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, }
]; ];
/** /**
@ -333,13 +333,13 @@ export async function createDictionaryTypeAsync({
changeOkLoading, changeOkLoading,
closeModal, closeModal,
validate, validate,
resetFields, resetFields
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
await _dataDictionaryServiceProxy.create(request); await _dataDictionaryServiceProxy.create(request);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
resetFields(); resetFields();
changeOkLoading(false); changeOkLoading(false);
closeModal(); closeModal();
@ -351,7 +351,7 @@ export async function editDictionaryTypeAsync({ request, changeOkLoading, valida
await validate(); await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
await _dataDictionaryServiceProxy.update(request); await _dataDictionaryServiceProxy.update(request);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
changeOkLoading(false); changeOkLoading(false);
closeModal(); closeModal();
} }
@ -368,13 +368,13 @@ export async function createDetailsDictionaryAsync({
changeOkLoading, changeOkLoading,
validate, validate,
resetFields, resetFields,
closeModal, closeModal
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
await _dataDictionaryServiceProxy.createDetail(request); await _dataDictionaryServiceProxy.createDetail(request);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
resetFields(); resetFields();
changeOkLoading(false); changeOkLoading(false);
closeModal(); closeModal();
@ -392,13 +392,13 @@ export async function editDetailsDictionaryAsync({
request, request,
changeOkLoading, changeOkLoading,
validate, validate,
closeModal, closeModal
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
await _dataDictionaryServiceProxy.updateDetail(request); await _dataDictionaryServiceProxy.updateDetail(request);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
changeOkLoading(false); changeOkLoading(false);
closeModal(); closeModal();
} }

353
vben271/src/views/admin/dictionary/AbpDictionary.vue

@ -9,8 +9,8 @@
:clickToRowSelect="false" :clickToRowSelect="false"
> >
<template #text="{ record }"> <template #text="{ record }">
{{record.code}}| {{ record.code }}|
{{record.displayText}} {{ record.displayText }}
</template> </template>
<template #toolbar> <template #toolbar>
<a-button <a-button
@ -19,7 +19,8 @@
preIcon="ant-design:plus-circle-outlined" preIcon="ant-design:plus-circle-outlined"
@click="handleCreateType" @click="handleCreateType"
> >
{{ t('common.createText') }}</a-button {{ t("common.createText") }}
</a-button
> >
</template> </template>
<template #action="{ record }"> <template #action="{ record }">
@ -46,7 +47,8 @@
type="primary" type="primary"
@click="handleCreate" @click="handleCreate"
> >
{{ t('common.createText') }}</a-button {{ t("common.createText") }}
</a-button
> >
</template> </template>
@ -78,184 +80,187 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from "vue";
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { PageWrapper } from '/@/components/Page'; import { PageWrapper } from "/@/components/Page";
import { useModal } from '/@/components/Modal'; import { useModal } from "/@/components/Modal";
import CreateAbpDictionary from './CreateAbpDictionary.vue'; import CreateAbpDictionary from "./CreateAbpDictionary.vue";
import EditAbpDictionary from './EditAbpDictionary.vue'; import EditAbpDictionary from "./EditAbpDictionary.vue";
import EditAbpDictionaryType from './EditAbpDictionaryType.vue'; import EditAbpDictionaryType from "./EditAbpDictionaryType.vue";
import CreateAbpDictionaryType from './CreateAbpDictionaryType.vue'; import CreateAbpDictionaryType from "./CreateAbpDictionaryType.vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { import {
tableColumns, tableColumns,
searchFormSchema, searchFormSchema,
getDictionaryTypeAsync, getDictionaryTypeAsync,
dictionaryTypeTableColumns, dictionaryTypeTableColumns,
searchDictionaryFormSchema, searchDictionaryFormSchema,
getDictionaryDetailsAsync, getDictionaryDetailsAsync,
deleteDetailAsync, deleteDetailAsync,
deleteDictionaryTypeAsync, deleteDictionaryTypeAsync
} from '/@/views/admin/dictionary/AbpDictionary'; } from "/@/views/admin/dictionary/AbpDictionary";
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from "/@/hooks/web/useMessage";
import { Tag, message } from 'ant-design-vue'; import { Tag, message } from "ant-design-vue";
export default defineComponent({
name: 'AbpDictionary',
components: {
BasicTable,
PageWrapper,
TableAction,
Tag,
CreateAbpDictionaryType,
CreateAbpDictionary,
EditAbpDictionary,
EditAbpDictionaryType,
},
setup() {
const { t } = useI18n();
const [registerCreateModal, { openModal: createModal }] = useModal(); export default defineComponent({
const [registerEditModal, { openModal: editModal }] = useModal(); name: "AbpDictionary",
const [registerEditTypeModal, { openModal: editTypeModal }] = useModal(); components: {
const [registerCreateType, { openModal: createTypeModal }] = useModal(); BasicTable,
const selectedDataDictionaryIdRef = ref(''); PageWrapper,
const selectedDataDictionaryDisplayTextRef = ref(''); TableAction,
Tag,
CreateAbpDictionaryType,
CreateAbpDictionary,
EditAbpDictionary,
EditAbpDictionaryType
},
setup() {
const { t } = useI18n();
// const [registerCreateModal, { openModal: createModal }] = useModal();
const [registerTypeTable, { reload: reloadType, clearSelectedRowKeys }] = useTable({ const [registerEditModal, { openModal: editModal }] = useModal();
columns: dictionaryTypeTableColumns, const [registerEditTypeModal, { openModal: editTypeModal }] = useModal();
formConfig: { const [registerCreateType, { openModal: createTypeModal }] = useModal();
labelWidth: 0, const selectedDataDictionaryIdRef = ref("");
schemas: searchDictionaryFormSchema, const selectedDataDictionaryDisplayTextRef = ref("");
showResetButton: false,
},
api: getDictionaryTypeAsync,
useSearchForm: true,
showTableSetting: false,
showIndexColumn: false,
bordered: true,
canResize: true,
rowSelection: { type: 'radio' },
pagination: false,
actionColumn: {
width: 50,
title: t('common.action'),
dataIndex: 'action',
slots: { customRender: 'action' },
},
});
// //
const onSelectChange = ({ rows }) => { const [registerTypeTable, { reload: reloadType, clearSelectedRowKeys }] = useTable({
selectedDataDictionaryIdRef.value = rows[0].id; columns: dictionaryTypeTableColumns,
selectedDataDictionaryDisplayTextRef.value = rows[0].displayText; formConfig: {
reload(); labelWidth: 0,
}; schemas: searchDictionaryFormSchema,
showResetButton: false
},
api: getDictionaryTypeAsync,
useSearchForm: true,
showTableSetting: false,
showIndexColumn: false,
bordered: true,
canResize: true,
rowSelection: { type: "radio" },
pagination: false,
actionColumn: {
width: 50,
title: t("common.action"),
dataIndex: "action",
slots: { customRender: "action" }
}
});
const handleCreate = () => { //
if (selectedDataDictionaryIdRef.value == '') { const onSelectChange = ({ rows }) => {
message.error(t('routes.admin.chooseDictionary')); selectedDataDictionaryIdRef.value = rows[0].id;
return; selectedDataDictionaryDisplayTextRef.value = rows[0].displayText;
} else { reload();
let dictionaryCreate = { };
id: selectedDataDictionaryIdRef.value,
displayText: selectedDataDictionaryDisplayTextRef.value, const handleCreate = () => {
}; if (selectedDataDictionaryIdRef.value == "") {
createModal(true, { dictionaryCreate: dictionaryCreate }); message.error(t("routes.admin.chooseDictionary"));
} return;
}; } else {
const handleEditType = (record: Recordable) => { let dictionaryCreate = {
editTypeModal(true, { id: selectedDataDictionaryIdRef.value,
record: record, displayText: selectedDataDictionaryDisplayTextRef.value
}); };
}; createModal(true, { dictionaryCreate: dictionaryCreate });
const handleDeleteDictionaryType = async (record: Recordable) => { }
let msg = t('common.askDelete'); };
createConfirm({ const handleEditType = (record: Recordable) => {
iconType: 'warning', editTypeModal(true, {
title: t('common.tip'), record: record
content: msg,
onOk: async () => {
await deleteDictionaryTypeAsync({
id: record.id,
reloadType,
});
await reload()
},
});
};
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
api: getDictionaryPageDetailsAsync,
useSearchForm: true,
showTableSetting: true,
showIndexColumn: true,
bordered: true,
canResize: true,
actionColumn: {
width: 150,
title: t('common.action'),
dataIndex: 'action',
slots: { customRender: 'action' },
},
}); });
async function getDictionaryPageDetailsAsync(params) { };
if (selectedDataDictionaryIdRef.value == '') { const handleDeleteDictionaryType = async (record: Recordable) => {
return []; let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
await deleteDictionaryTypeAsync({
id: record.id,
reloadType
});
await reload();
} }
params.dataDictionaryId = selectedDataDictionaryIdRef.value; });
return await getDictionaryDetailsAsync({ params }); };
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema
},
api: getDictionaryPageDetailsAsync,
useSearchForm: true,
showTableSetting: true,
showIndexColumn: true,
bordered: true,
canResize: true,
actionColumn: {
width: 150,
title: t("common.action"),
dataIndex: "action",
slots: { customRender: "action" }
} }
const handleEdit = (record: Recordable) => { });
editModal(true, {
record: record, async function getDictionaryPageDetailsAsync(params) {
}); if (selectedDataDictionaryIdRef.value == "") {
}; return [];
const handleCreateType = () => { }
createTypeModal(true); params.dataDictionaryId = selectedDataDictionaryIdRef.value;
}; return await getDictionaryDetailsAsync({ params });
const { createConfirm } = useMessage(); }
const handleDelete = async (record: Recordable) => {
let msg = t('common.askDelete'); const handleEdit = (record: Recordable) => {
createConfirm({ editModal(true, {
iconType: 'warning', record: record
title: t('common.tip'), });
content: msg, };
onOk: async () => { const handleCreateType = () => {
await deleteDetailAsync({ createTypeModal(true);
dataDictionaryId: record.dataDictionaryId, };
dataDictionaryDetailId: record.id, const { createConfirm } = useMessage();
reload, const handleDelete = async (record: Recordable) => {
}); let msg = t("common.askDelete");
}, createConfirm({
}); iconType: "warning",
}; title: t("common.tip"),
return { content: msg,
registerTable, onOk: async () => {
registerCreateModal, await deleteDetailAsync({
registerEditModal, dataDictionaryId: record.dataDictionaryId,
registerEditTypeModal, dataDictionaryDetailId: record.id,
handleCreate, reload
handleEdit, });
handleEditType, }
reload, });
registerTypeTable, };
registerCreateType, return {
handleCreateType, registerTable,
reloadType, registerCreateModal,
onSelectChange, registerEditModal,
clearSelectedRowKeys, registerEditTypeModal,
t, handleCreate,
handleDelete, handleEdit,
handleDeleteDictionaryType, handleEditType,
}; reload,
}, registerTypeTable,
}); registerCreateType,
handleCreateType,
reloadType,
onSelectChange,
clearSelectedRowKeys,
t,
handleDelete,
handleDeleteDictionaryType
};
}
});
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

104
vben271/src/views/admin/dictionary/CreateAbpDictionary.vue

@ -14,64 +14,64 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { createFormSchema, createDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary"; import { createFormSchema, createDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({ export default defineComponent({
name: 'CreateDictionary', name: "CreateDictionary",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({ setFieldsValue({
id: data.dictionaryCreate.id, id: data.dictionaryCreate.id,
typeDisplayText: data.dictionaryCreate.displayText, typeDisplayText: data.dictionaryCreate.displayText
}); });
});
const [registerDictionaryForm, { resetFields, getFieldsValue, validate, setFieldsValue }] =
useForm({
labelWidth: 120,
schemas: createFormSchema,
showActionButtonGroup: false
}); });
const [registerDictionaryForm, { resetFields, getFieldsValue, validate, setFieldsValue }] = const submit = async () => {
useForm({ try {
labelWidth: 120, let request = getFieldsValue();
schemas: createFormSchema, await createDetailsDictionaryAsync({
showActionButtonGroup: false, request,
changeOkLoading,
validate,
resetFields,
closeModal
}); });
const submit = async () => { emit("reload");
try { } catch (error) {
let request = getFieldsValue(); changeOkLoading(false);
await createDetailsDictionaryAsync({ }
request, };
changeOkLoading,
validate,
resetFields,
closeModal,
});
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
// emit('clearSelectedRowKeys'); // emit('clearSelectedRowKeys');
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerDictionaryForm, registerDictionaryForm,
submit, submit,
t, t,
cancel, cancel
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

95
vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue

@ -14,56 +14,57 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary"; import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'CreateAbpDictionaryType',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(); export default defineComponent({
const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({ name: "CreateAbpDictionaryType",
labelWidth: 100, components: {
schemas: createDictionaryTypeFormSchema, BasicModal,
showActionButtonGroup: false, BasicForm
}); },
const submit = async () => { setup(_, { emit }) {
try { const { t } = useI18n();
let request = getFieldsValue();
await createDictionaryTypeAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields,
});
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner();
resetFields(); const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({
closeModal(); labelWidth: 100,
}; schemas: createDictionaryTypeFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await createDictionaryTypeAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
return { const cancel = () => {
registerModal, resetFields();
registerDictionaryTypeForm, closeModal();
submit, };
t,
cancel, return {
}; registerModal,
}, registerDictionaryTypeForm,
}); submit,
t,
cancel
};
}
});
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

100
vben271/src/views/admin/dictionary/EditAbpDictionary.vue

@ -14,61 +14,61 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { editFormSchema, editDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary"; import { editFormSchema, editDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({ export default defineComponent({
name: 'EditDictionary', name: "EditDictionary",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({ setFieldsValue({
id: data.record.id, id: data.record.id,
dataDictionaryId: data.record.dataDictionaryId, dataDictionaryId: data.record.dataDictionaryId,
displayText: data.record.displayText, displayText: data.record.displayText,
description: data.record.description, description: data.record.description,
code: data.record.code, code: data.record.code,
order: data.record.order, order: data.record.order
});
}); });
const [registerDictionaryForm, { setFieldsValue, getFieldsValue, validate, resetFields }] = });
useForm({ const [registerDictionaryForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
labelWidth: 120, useForm({
schemas: editFormSchema, labelWidth: 120,
showActionButtonGroup: false, schemas: editFormSchema,
}); showActionButtonGroup: false
const submit = async () => { });
try { const submit = async () => {
let request = getFieldsValue(); try {
await editDetailsDictionaryAsync({ request, changeOkLoading, validate, closeModal }); let request = getFieldsValue();
emit('reload'); await editDetailsDictionaryAsync({ request, changeOkLoading, validate, closeModal });
} catch (error) { emit("reload");
changeOkLoading(false); } catch (error) {
} changeOkLoading(false);
}; }
};
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerDictionaryForm, registerDictionaryForm,
submit, submit,
cancel, cancel,
t, t
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

99
vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue

@ -14,59 +14,60 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { editDictionaryTypeFormSchema, editDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary"; import { editDictionaryTypeFormSchema, editDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'EditDictionary', export default defineComponent({
components: { name: "EditDictionary",
BasicModal, components: {
BasicForm, BasicModal,
}, BasicForm
setup(_, { emit }) { },
const { t } = useI18n(); setup(_, { emit }) {
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const { t } = useI18n();
setFieldsValue({ const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
id: data.record.id, setFieldsValue({
code: data.record.code, id: data.record.id,
description: data.record.description, code: data.record.code,
displayText: data.record.displayText, description: data.record.description,
key: data.record.key, displayText: data.record.displayText,
}); key: data.record.key
});
});
const [registerDictionaryTypeForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 100,
schemas: editDictionaryTypeFormSchema,
showActionButtonGroup: false
}); });
const [registerDictionaryTypeForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 100,
schemas: editDictionaryTypeFormSchema,
showActionButtonGroup: false,
});
const submit = async () => { const submit = async () => {
try { try {
let request = getFieldsValue(); let request = getFieldsValue();
await editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal }); await editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal });
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerDictionaryTypeForm, registerDictionaryTypeForm,
submit, submit,
t, t,
cancel, cancel
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

54
vben271/src/views/admin/elasticSearch/ElasticSearch.ts

@ -1,50 +1,52 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n(); const { t } = useI18n();
import moment from 'moment'; import moment from "moment";
import { import {
EsLogServiceProxy, EsLogServiceProxy,
PagingElasticSearchLogInput, PagingElasticSearchLogInput,
PagingElasticSearchLogOutputCustomePagedResultDto, PagingElasticSearchLogOutputCustomePagedResultDto
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
component: 'Input', component: "Input",
label: t('common.key'), label: t("common.key"),
labelWidth: 80, labelWidth: 80,
colProps: { colProps: {
span: 6, span: 6
}, }
}, },
{ {
field: 'time', field: "time",
component: 'RangePicker', component: "RangePicker",
label: '创建时间:', label: "创建时间:",
labelWidth: 80, labelWidth: 80,
colProps: { span: 6 }, colProps: { span: 6 },
defaultValue: [moment().subtract(0, 'days'), moment().add(1, 'days')], defaultValue: [moment().subtract(0, "days"), moment().add(1, "days")]
}, }
]; ];
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.logLevel'), title: t("routes.admin.logLevel"),
dataIndex: 'level', dataIndex: "level",
width: 200, width: 200
}, },
{ {
title: t('common.creationTime'), title: t("common.creationTime"),
dataIndex: 'creationTime', dataIndex: "creationTime",
customRender: ({ text }) => { customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss'); return moment(text).format("YYYY-MM-DD HH:mm:ss");
}, },
width: 200, width: 200
}, },
{ {
title: t('routes.admin.logContent'), title: t("routes.admin.logContent"),
dataIndex: 'message', dataIndex: "message"
}, }
]; ];
/** /**

119
vben271/src/views/admin/elasticSearch/ElasticSearch.vue

@ -2,9 +2,9 @@
<div> <div>
<BasicTable @register="registerTable" size="small"> <BasicTable @register="registerTable" size="small">
<template #action="{ record }"> <template #action="{ record }">
<a-button type="link" size="small" @click="lookJson(record)">{{ <a-button type="link" size="small" @click="lookJson(record)">
t('common.detail') {{ t("common.detail") }}
}}</a-button> </a-button>
</template> </template>
</BasicTable> </BasicTable>
<BasicModal :canFullscreen="false" @register="registerModal" :showOkButton="false"> <BasicModal :canFullscreen="false" @register="registerModal" :showOkButton="false">
@ -14,64 +14,65 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from "vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModal } from '/@/components/Modal'; import { BasicModal, useModal } from "/@/components/Modal";
import { BasicTable, useTable } from '/@/components/Table'; import { BasicTable, useTable } from "/@/components/Table";
import { import {
getElasticSearchLogAsync, getElasticSearchLogAsync,
tableColumns, tableColumns,
searchFormSchema, searchFormSchema
} from '/@/views/admin/elasticSearch/ElasticSearch'; } from "/@/views/admin/elasticSearch/ElasticSearch";
export default defineComponent({
name: 'ElasticSearch', export default defineComponent({
components: { name: "ElasticSearch",
BasicTable, components: {
BasicModal, BasicTable,
}, BasicModal
setup() { },
const { t } = useI18n(); setup() {
const [registerModal, { openModal: openJsonModal }] = useModal(); const { t } = useI18n();
const [registerTable, { reload }] = useTable({ const [registerModal, { openModal: openJsonModal }] = useModal();
columns: tableColumns, const [registerTable, { reload }] = useTable({
formConfig: { columns: tableColumns,
labelWidth: 100, formConfig: {
schemas: searchFormSchema, labelWidth: 100,
fieldMapToTime: [['time', ['startCreationTime', 'endCreationTime']]], schemas: searchFormSchema,
}, fieldMapToTime: [["time", ["startCreationTime", "endCreationTime"]]]
api: getElasticSearchLogAsync, },
useSearchForm: true, api: getElasticSearchLogAsync,
showTableSetting: true, useSearchForm: true,
bordered: true, showTableSetting: true,
canResize: true, bordered: true,
showIndexColumn: true, canResize: true,
actionColumn: { showIndexColumn: true,
title: t('common.action'), actionColumn: {
dataIndex: 'action', title: t("common.action"),
slots: { dataIndex: "action",
customRender: 'action', slots: {
}, customRender: "action"
width: 150,
fixed: 'right',
}, },
}); width: 150,
let content = ref(''); fixed: "right"
const lookJson = async (record) => { }
openJsonModal(); });
content.value = record.message; let content = ref("");
}; const lookJson = async (record) => {
openJsonModal();
content.value = record.message;
};
return { return {
t, t,
registerTable, registerTable,
reload, reload,
lookJson, lookJson,
registerModal, registerModal,
openJsonModal, openJsonModal,
content, content
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

35
vben271/src/views/admin/files/File.ts

@ -1,31 +1,32 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import moment from 'moment'; import moment from "moment";
import { FilesServiceProxy, PagingFileInput } from '/@/services/ServiceProxies'; import { FilesServiceProxy, PagingFileInput } from "/@/services/ServiceProxies";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n(); const { t } = useI18n();
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.fileName'), label: t("routes.admin.fileName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, }
]; ];
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.fileName'), title: t("routes.admin.fileName"),
dataIndex: 'fileName', dataIndex: "fileName"
}, },
{ {
title: t('routes.admin.userManagement_createTime'), title: t("routes.admin.userManagement_createTime"),
dataIndex: 'creationTime', dataIndex: "creationTime",
customRender: ({ text }) => { customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss'); return moment(text).format("YYYY-MM-DD HH:mm:ss");
}, }
}, }
]; ];
/** /**

146
vben271/src/views/admin/files/File.vue

@ -32,81 +32,83 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from "vue";
import { UploadOutlined } from '@ant-design/icons-vue'; import { UploadOutlined } from "@ant-design/icons-vue";
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File"; import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File";
import { Tag } from 'ant-design-vue'; import { Tag } from "ant-design-vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { getOSSClient, importFileAsync, downLoadFile } from './UploadOss'; import { getOSSClient, importFileAsync, downLoadFile } from "./UploadOss";
import { CreateFileInput } from '/@/services/ServiceProxies'; import { CreateFileInput } from "/@/services/ServiceProxies";
import moment from 'moment'; import moment from "moment";
export default defineComponent({
components: { export default defineComponent({
BasicTable, components: {
TableAction, BasicTable,
Tag, TableAction,
UploadOutlined, Tag,
}, UploadOutlined
setup() { },
const { t } = useI18n(); setup() {
const fileList = ref([]); const { t } = useI18n();
// table const fileList = ref([]);
const [registerTable, { reload }] = useTable({ // table
columns: tableColumns, const [registerTable, { reload }] = useTable({
formConfig: { columns: tableColumns,
labelWidth: 70, formConfig: {
schemas: searchFormSchema, labelWidth: 70,
fieldMapToTime: [ schemas: searchFormSchema,
['time', ['executionBeginTime', 'executionEndTime'], 'YYYY-MM-DD HH:mm:ss'], fieldMapToTime: [
], ["time", ["executionBeginTime", "executionEndTime"], "YYYY-MM-DD HH:mm:ss"]
}, ]
api: getTableListAsync, },
showTableSetting: true, api: getTableListAsync,
useSearchForm: true, showTableSetting: true,
bordered: true, useSearchForm: true,
canResize: true, bordered: true,
showIndexColumn: true, canResize: true,
actionColumn: { showIndexColumn: true,
width: 120, actionColumn: {
title: t('common.action'), width: 120,
dataIndex: 'action', title: t("common.action"),
slots: { dataIndex: "action",
customRender: 'action', slots: {
}, customRender: "action"
fixed: 'right',
}, },
}); fixed: "right"
}
});
async function customRequest(action) { async function customRequest(action) {
let fileName = action.file.name; let fileName = action.file.name;
let index = fileName.lastIndexOf('.'); let index = fileName.lastIndexOf(".");
let type = fileName.slice(index + 1); let type = fileName.slice(index + 1);
let name = fileName.slice(0, index); let name = fileName.slice(0, index);
const client = await getOSSClient(); const client = await getOSSClient();
let fileFullName = `host/${moment().format('YYYY-MM-DD')}/${name}_${moment().format( let fileFullName = `host/${moment().format("YYYY-MM-DD")}/${name}_${moment().format(
'X' "X"
)}.${type}`; )}.${type}`;
await client.put(fileFullName, action.file); await client.put(fileFullName, action.file);
let request = new CreateFileInput(); let request = new CreateFileInput();
request.fileName = fileName; request.fileName = fileName;
request.filePath = fileFullName; request.filePath = fileFullName;
await importFileAsync({ request }); await importFileAsync({ request });
await reload(); await reload();
} }
const handleDownload = async (record: Recordable) => {
await downLoadFile(record.filePath); const handleDownload = async (record: Recordable) => {
}; await downLoadFile(record.filePath);
return { };
t, return {
fileList, t,
registerTable, fileList,
customRequest, registerTable,
handleDownload, customRequest,
}; handleDownload
}, };
}); }
});
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

36
vben271/src/views/admin/files/UploadOss.ts

@ -1,6 +1,6 @@
import { FilesServiceProxy, FileTokenOutput } from '/@/services/ServiceProxies'; import { FilesServiceProxy, FileTokenOutput } from "/@/services/ServiceProxies";
import OSS from 'ali-oss'; import OSS from "ali-oss";
import moment from 'moment'; import moment from "moment";
export async function importFileAsync({ request }) { export async function importFileAsync({ request }) {
const _filesServiceProxy = new FilesServiceProxy(); const _filesServiceProxy = new FilesServiceProxy();
@ -10,20 +10,20 @@ export async function importFileAsync({ request }) {
async function getFileTokenAsync() { async function getFileTokenAsync() {
const _filesServiceProxy = new FilesServiceProxy(); const _filesServiceProxy = new FilesServiceProxy();
const result = await _filesServiceProxy.getFileToken(); const result = await _filesServiceProxy.getFileToken();
sessionStorage.setItem('oss', JSON.stringify(result)); sessionStorage.setItem("oss", JSON.stringify(result));
return result; return result;
} }
export async function getOSSClient(): Promise<OSS> { export async function getOSSClient(): Promise<OSS> {
let fileToken = new FileTokenOutput(); let fileToken = new FileTokenOutput();
try { try {
let oss = sessionStorage.getItem('oss'); let oss = sessionStorage.getItem("oss");
if (!oss) { if (!oss) {
fileToken = await getFileTokenAsync(); fileToken = await getFileTokenAsync();
} else { } else {
fileToken = JSON.parse(oss); fileToken = JSON.parse(oss);
let expiration = moment(fileToken.expiration).format('YYYY-MM-DD HH:mm:ss'); let expiration = moment(fileToken.expiration).format("YYYY-MM-DD HH:mm:ss");
debugger; debugger;
if (expiration < formatDate(moment.now())) { if (expiration < formatDate(moment.now())) {
fileToken = await getFileTokenAsync(); fileToken = await getFileTokenAsync();
@ -34,36 +34,36 @@ export async function getOSSClient(): Promise<OSS> {
accessKeyId: fileToken.accessKeyId, accessKeyId: fileToken.accessKeyId,
accessKeySecret: fileToken.accessKeySecret, accessKeySecret: fileToken.accessKeySecret,
bucket: fileToken.bucket, bucket: fileToken.bucket,
stsToken: fileToken.token as string, stsToken: fileToken.token as string
}; };
return Promise.resolve<OSS>(new OSS(request)); return Promise.resolve<OSS>(new OSS(request));
} catch (error) { } catch (error) {
console.error('获取oss Client失败'); console.error("获取oss Client失败");
} }
} }
export async function downLoadFile(fileName) { export async function downLoadFile(fileName) {
let oss = await getOSSClient(); let oss = await getOSSClient();
const response = { const response = {
'content-disposition': `attachment; filename=${encodeURIComponent(fileName)}`, "content-disposition": `attachment; filename=${encodeURIComponent(fileName)}`
}; };
const url = (oss as OSS).signatureUrl(fileName, { response }); const url = (oss as OSS).signatureUrl(fileName, { response });
let link = document.createElement('a'); //创建a标签 let link = document.createElement("a"); //创建a标签
link.style.display = 'none'; //使其隐藏 link.style.display = "none"; //使其隐藏
link.href = url; //赋予文件下载地址 link.href = url; //赋予文件下载地址
link.setAttribute('download', fileName); //设置下载属性 以及文件名 link.setAttribute("download", fileName); //设置下载属性 以及文件名
document.body.appendChild(link); //a标签插至页面中 document.body.appendChild(link); //a标签插至页面中
link.click(); //强制触发a标签事件 link.click(); //强制触发a标签事件
} }
function formatDate(dateTime) { function formatDate(dateTime) {
const date = new Date(dateTime); const date = new Date(dateTime);
const YY = date.getFullYear() + '-'; const YY = date.getFullYear() + "-";
const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; const MM = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";
const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); const DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
const hh = date.getHours() + ':'; const hh = date.getHours() + ":";
const mm = date.getMinutes() + ':'; const mm = date.getMinutes() + ":";
const ss = date.getSeconds(); const ss = date.getSeconds();
return YY + MM + DD + ' ' + hh + mm + ss; return YY + MM + DD + " " + hh + mm + ss;
} }

62
vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue

@ -7,10 +7,9 @@
:maskClosable="false" :maskClosable="false"
@cancel="cancel" @cancel="cancel"
@register="registerModal" @register="registerModal"
:minHeight="100"
:destroyOnClose="true" :destroyOnClose="true"
> >
<BasicTable @register="registerRoleTable" size="small"/> <BasicTable @register="registerRoleTable" @selection-change="onSelectChange" size="small" />
</BasicModal> </BasicModal>
</div> </div>
</template> </template>
@ -21,45 +20,63 @@ import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm } from "/@/components/Form/index"; import { BasicForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n"; import { useI18n } from "/@/hooks/web/useI18n";
import { import {
getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema, addRoleToOrganizationUnitAsync, GetUnAddUserAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit"; } from "/@/views/admin/organizationUnits/OrganizationUnit";
import { AddRoleToOrganizationUnitInput } from "/@/services/ServiceProxies"; import { AddRoleToOrganizationUnitInput, GetUnAddRoleInput } from "/@/services/ServiceProxies";
import { useTable } from "/@/components/Table"; import { BasicTable, useTable } from "/@/components/Table";
export default defineComponent({ export default defineComponent({
name: "AddRoleToOrganizationUnit", name: "AddRoleToOrganizationUnit",
components: { components: {
BasicModal, BasicModal,
BasicForm BasicForm,
BasicTable
}, },
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const getTableAsync = async () => {
getForm().setFieldsValue({ let request= new GetUnAddRoleInput();
organizationUnitId: data.organizationUnitId request.organizationUnitId=organizationUnitId;
}); return await getUnAddRolesAsync(request)
}); };
const [registerRoleTable, { getForm,getSelectRowKeys }] = useTable({ const [registerRoleTable, { reload }] = useTable({
columns: addRoleTableColumns, columns: addRoleTableColumns,
formConfig: { formConfig: {
labelWidth: 70, labelWidth: 70,
schemas: searchAddRoleFormSchema schemas: searchAddRoleFormSchema
}, },
api: getUnAddRolesAsync, api: getTableAsync,
showTableSetting: true, showTableSetting: false,
useSearchForm: false, useSearchForm: false,
bordered: true, bordered: true,
canResize: true, showIndexColumn: true,
showIndexColumn: true maxHeight: 400,
immediate: false,
rowSelection: { type: "checkbox" }
});
let organizationUnitId = "";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (data) => {
organizationUnitId = data.organizationUnitId;
await reload();
}); });
//
let selectRoles:string[]=[];
const onSelectChange = ({ rows }) => {
selectRoles = rows.map((item)=>{
return item.id;
})
};
const submit = async () => { const submit = async () => {
try { try {
let selectedRoles = getSelectRowKeys(); changeOkLoading(true)
console.log(selectedRoles);
let request = new AddRoleToOrganizationUnitInput(); let request = new AddRoleToOrganizationUnitInput();
request.organizationUnitId = getForm().getFieldsValue().organizationUnitId; request.organizationUnitId = organizationUnitId;
request.roleId=selectRoles;
await addRoleToOrganizationUnitAsync(request);
changeOkLoading(false);
closeModal();
emit("reload"); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
@ -67,6 +84,8 @@ export default defineComponent({
}; };
const cancel = () => { const cancel = () => {
organizationUnitId='';
selectRoles=[]
closeModal(); closeModal();
}; };
@ -75,7 +94,8 @@ export default defineComponent({
registerRoleTable, registerRoleTable,
submit, submit,
t, t,
cancel cancel,
onSelectChange
}; };
} }
}); });

111
vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue

@ -0,0 +1,111 @@
<template>
<div>
<BasicModal
:title="t('common.createText')"
:canFullscreen="false"
@ok="submit"
:maskClosable="false"
@cancel="cancel"
@register="registerModal"
:destroyOnClose="true"
>
<BasicTable @register="registerRoleTable" @selection-change="onSelectChange" size="small" />
</BasicModal>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
addUserTableColumns, searchUserFormSchema, addUserToOrganizationUnitAsync, GetUnAddUserAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import { AddUserToOrganizationUnitInput, GetUnAddUserInput } from "/@/services/ServiceProxies";
import { BasicTable, useTable } from "/@/components/Table";
export default defineComponent({
name: "AddUserToOrganizationUnit",
components: {
BasicModal,
BasicForm,
BasicTable
},
setup(_, { emit }) {
const { t } = useI18n();
const getTableAsync = async () => {
let request= new GetUnAddUserInput();
request.organizationUnitId=organizationUnitId;
request.filter=getForm().getFieldsValue().filter;
return await GetUnAddUserAsync(request)
};
const [registerRoleTable, { reload,getForm }] = useTable({
columns: addUserTableColumns,
formConfig: {
labelWidth: 70,
schemas: searchUserFormSchema,
showResetButton: false
},
api: getTableAsync,
showTableSetting: false,
useSearchForm: true,
bordered: true,
showIndexColumn: true,
maxHeight: 400,
immediate: false,
rowSelection: { type: "checkbox" }
});
let organizationUnitId = "";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (data) => {
organizationUnitId = data.organizationUnitId;
await reload({ searchInfo: { organizationUnitId: organizationUnitId } });
});
//
let selectUsers: string[] = [];
const onSelectChange = ({ rows }) => {
selectUsers = rows.map((item) => {
return item.id;
});
};
const submit = async () => {
try {
changeOkLoading(true);
let request = new AddUserToOrganizationUnitInput();
request.organizationUnitId = organizationUnitId;
request.userId = selectUsers;
await addUserToOrganizationUnitAsync(request);
changeOkLoading(false);
closeModal();
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
organizationUnitId = "";
selectUsers = [];
closeModal();
};
return {
registerModal,
registerRoleTable,
submit,
t,
cancel,
onSelectChange
};
}
});
</script>
<style lang="less" scoped></style>

128
vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue

@ -16,74 +16,74 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { import {
createOrganizationUnitFormSchema, createOrganizationUnitFormSchema,
createOrganizationUnitAsync, createOrganizationUnitAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit"; } from "/@/views/admin/organizationUnits/OrganizationUnit";
export default defineComponent({ export default defineComponent({
name: 'CreateOrganizationUnit', name: "CreateOrganizationUnit",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
if (data.record.parentId == '') { if (data.record.parentId == "") {
updateSchema({ field: 'parentDisplayName', ifShow: false }); updateSchema({ field: "parentDisplayName", ifShow: false });
} else { } else {
updateSchema({ field: 'parentDisplayName', ifShow: true }); updateSchema({ field: "parentDisplayName", ifShow: true });
setFieldsValue({ setFieldsValue({
parentDisplayName: data.record.parentDisplayName, parentDisplayName: data.record.parentDisplayName,
parentId: data.record.parentId, parentId: data.record.parentId
}); });
} }
}); });
const [ const [
registerOrganizationUnitForm, registerOrganizationUnitForm,
{ resetFields, getFieldsValue, validate, setFieldsValue, updateSchema }, { resetFields, getFieldsValue, validate, setFieldsValue, updateSchema }
] = useForm({ ] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: createOrganizationUnitFormSchema, schemas: createOrganizationUnitFormSchema,
showActionButtonGroup: false, showActionButtonGroup: false
}); });
const submit = async () => { const submit = async () => {
try { try {
let request = getFieldsValue(); let request = getFieldsValue();
await createOrganizationUnitAsync({ await createOrganizationUnitAsync({
request, request,
changeOkLoading, changeOkLoading,
validate, validate,
resetFields, resetFields,
closeModal, closeModal
}); });
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
// emit('clearSelectedRowKeys'); // emit('clearSelectedRowKeys');
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerOrganizationUnitForm, registerOrganizationUnitForm,
submit, submit,
t, t,
cancel, cancel
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

98
vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue

@ -16,60 +16,60 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { editOrganizationUnitFormSchema, editOrganizationUnitAsync } from "/@/views/admin/organizationUnits/OrganizationUnit"; import { editOrganizationUnitFormSchema, editOrganizationUnitAsync } from "/@/views/admin/organizationUnits/OrganizationUnit";
export default defineComponent({ export default defineComponent({
name: 'EditOrganizationUnit', name: "EditOrganizationUnit",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({ setFieldsValue({
displayName: data.record.displayName, displayName: data.record.displayName,
id: data.record.id, id: data.record.id
});
});
const [registerOrganizationUnitForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
labelWidth: 120,
schemas: editOrganizationUnitFormSchema,
showActionButtonGroup: false,
}); });
const submit = async () => { });
try { const [registerOrganizationUnitForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
let request = getFieldsValue(); labelWidth: 120,
await editOrganizationUnitAsync({ schemas: editOrganizationUnitFormSchema,
request, showActionButtonGroup: false
changeOkLoading, });
validate, const submit = async () => {
closeModal, try {
}); let request = getFieldsValue();
emit('reload'); await editOrganizationUnitAsync({
} catch (error) { request,
changeOkLoading(false); changeOkLoading,
} validate,
}; closeModal
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => { const cancel = () => {
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerOrganizationUnitForm, registerOrganizationUnitForm,
submit, submit,
t, t,
cancel, cancel
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

174
vben271/src/views/admin/organizationUnits/OrganizationUnit.ts

@ -10,161 +10,165 @@ import {
GetUnAddRoleInput, GetUnAddRoleInput,
GetUnAddUserInput GetUnAddUserInput
} from "/@/services/ServiceProxies"; } from "/@/services/ServiceProxies";
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n(); const { t } = useI18n();
export const createOrganizationUnitFormSchema: FormSchema[] = [ export const createOrganizationUnitFormSchema: FormSchema[] = [
{ {
field: 'parentDisplayName', field: "parentDisplayName",
label: t('routes.admin.parentOrganizationUnitName'), label: t("routes.admin.parentOrganizationUnitName"),
component: 'Input', component: "Input",
componentProps: { componentProps: {
disabled: true, disabled: true
}, },
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'displayName', field: "displayName",
label: t('routes.admin.organizationUnitName'), label: t("routes.admin.organizationUnitName"),
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'parentId', field: "parentId",
label: '', label: "",
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, },
ifShow: false, ifShow: false
}, }
]; ];
export const editOrganizationUnitFormSchema: FormSchema[] = [ export const editOrganizationUnitFormSchema: FormSchema[] = [
{ {
field: 'displayName', field: "displayName",
label: t('routes.admin.organizationUnitName'), label: t("routes.admin.organizationUnitName"),
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'id', field: "id",
label: '', label: "",
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, },
ifShow: false, ifShow: false
}, }
]; ];
export const addRoleToOrganizationUnitFormSchema: FormSchema[] = [ export const addRoleToOrganizationUnitFormSchema: FormSchema[] = [
{ {
field: 'displayName', field: "displayName",
label: t('routes.admin.organizationUnitName'), label: t("routes.admin.organizationUnitName"),
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, }
}, },
{ {
field: 'organizationUnitId', field: "organizationUnitId",
label: '', label: "",
component: 'Input', component: "Input",
colProps: { colProps: {
span: 18, span: 18
}, },
ifShow: false, ifShow: false
}, }
]; ];
export const userTableColumns: BasicColumn[] = [ export const userTableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_userName'), title: t("routes.admin.userManagement_userName"),
dataIndex: 'userName', dataIndex: "userName"
}, },
{ {
title: t('routes.admin.userManagement_email'), title: t("routes.admin.userManagement_email"),
dataIndex: 'email', dataIndex: "email"
} }
]; ];
export const addUserTableColumns: BasicColumn[] = [ export const addUserTableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_userName'), title: t("routes.admin.userManagement_userName"),
dataIndex: 'userName', dataIndex: "userName"
}, },
{ {
title: t('routes.admin.userManagement_email'), title: t("routes.admin.userManagement_email"),
dataIndex: 'email', dataIndex: "email"
} }
]; ];
export const roleTableColumns: BasicColumn[] = [ export const roleTableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_roleName'), title: t("routes.admin.userManagement_roleName"),
dataIndex: 'name', dataIndex: "name"
} }
]; ];
export const addRoleTableColumns: BasicColumn[] = [ export const addRoleTableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_roleName'), title: t("routes.admin.userManagement_roleName"),
dataIndex: 'name', dataIndex: "name"
} }
]; ];
export const searchAddRoleFormSchema: FormSchema[] = [ export const searchAddRoleFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, },
{ {
field: 'organizationUnitId', field: "organizationUnitId",
label: '', label: "",
component: 'Input', component: "Input",
ifShow:false, ifShow: false,
colProps: { span: 8 }, colProps: { span: 8 }
} }
]; ];
export const searchUserFormSchema: FormSchema[] = [ export const searchUserFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.userManagement_userName'), label: t("routes.admin.userManagement_userName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 10 }
}, },
{ {
field: 'organizationUnitId', field: "organizationUnitId",
label: '', label: "",
component: 'Input', component: "Input",
ifShow:false, ifShow: false,
colProps: { span: 8 }, colProps: { span: 8 }
} }
]; ];
export async function getTreeAsync() { export async function getTreeAsync() {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return await _organizationUnitsServiceProxy.tree(); return await _organizationUnitsServiceProxy.tree();
} }
export async function deleteTreeNodeAsync({ id }) { export async function deleteTreeNodeAsync({ id }) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
const request = new IdInput(); const request = new IdInput();
request.id = id; request.id = id;
return await _organizationUnitsServiceProxy.delete(request); return await _organizationUnitsServiceProxy.delete(request);
} }
export async function createOrganizationUnitAsync({ export async function createOrganizationUnitAsync({
request, request,
changeOkLoading, changeOkLoading,
closeModal, closeModal,
validate, validate,
resetFields, resetFields
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
@ -179,7 +183,7 @@ export async function editOrganizationUnitAsync({
request, request,
changeOkLoading, changeOkLoading,
closeModal, closeModal,
validate, validate
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
@ -193,42 +197,40 @@ export async function getUserTableListAsync(params: GetOrganizationUnitUserInput
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUsers(params); return _organizationUnitsServiceProxy.getUsers(params);
} }
export async function getRoleTableListAsync(params: GetOrganizationUnitRoleInput) { export async function getRoleTableListAsync(params: GetOrganizationUnitRoleInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getRoles(params); return _organizationUnitsServiceProxy.getRoles(params);
} }
export async function removeUserFromOrganizationUnitAsync(params:RemoveUserToOrganizationUnitInput) export async function removeUserFromOrganizationUnitAsync(params: RemoveUserToOrganizationUnitInput) {
{
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.removeUserFromOrganizationUnit(params); return _organizationUnitsServiceProxy.removeUserFromOrganizationUnit(params);
} }
export async function removeRoleFromOrganizationUnitAsync(params:RemoveRoleToOrganizationUnitInput)
{ export async function removeRoleFromOrganizationUnitAsync(params: RemoveRoleToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.removeRoleFromOrganizationUnit(params); return _organizationUnitsServiceProxy.removeRoleFromOrganizationUnit(params);
} }
export async function addRoleToOrganizationUnitAsync(params:AddRoleToOrganizationUnitInput)
{ export async function addRoleToOrganizationUnitAsync(params: AddRoleToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.addRoleToOrganizationUnit(params); return _organizationUnitsServiceProxy.addRoleToOrganizationUnit(params);
} }
export async function addUserToOrganizationUnitAsync(params:AddUserToOrganizationUnitInput)
{ export async function addUserToOrganizationUnitAsync(params: AddUserToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.addUserToOrganizationUnit(params); return _organizationUnitsServiceProxy.addUserToOrganizationUnit(params);
} }
export async function GetUnAddUserAsync(params:GetUnAddUserInput) export async function GetUnAddUserAsync(params: GetUnAddUserInput) {
{
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUnAddUsers(params); return _organizationUnitsServiceProxy.getUnAddUsers(params);
} }
export async function getUnAddRolesAsync(params:GetUnAddRoleInput) export async function getUnAddRolesAsync(params: GetUnAddRoleInput) {
{
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUnAddRoles(params); return _organizationUnitsServiceProxy.getUnAddRoles(params);
} }

93
vben271/src/views/admin/organizationUnits/OrganizationUnit.vue

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex"> <PageWrapper dense contentFullHeight contentClass="flex">
<div class="bg-white m-4 mr-0 overflow-hidden"> <div class="bg-white m-4 mr-0 overflow-hidden">
<BasicTree <BasicTree
toolbar toolbar
@ -10,14 +10,15 @@
@select="handleSelect" @select="handleSelect"
> >
<template #headerTitle> <template #headerTitle>
<span style="font-weight: 500">组织机构</span> <span style="font-weight: 500"> {{ t("routes.admin.organizationUnit") }}</span>
<a-button <a-button
type="primary" type="primary"
style="margin-left: 20px" style="margin-left: 20px"
size="small" size="small"
v-auth="'System.OrganizationUnitManagement.Create'"
@click="createRootOrganizationUnit" @click="createRootOrganizationUnit"
> >
添加根机构 {{ t("routes.admin.createRootOrganizationUnit") }}
</a-button> </a-button>
</template> </template>
</BasicTree> </BasicTree>
@ -25,15 +26,26 @@
<div class="bg-white m-4 mr-0 w-3/4 xl:w-4/5"> <div class="bg-white m-4 mr-0 w-3/4 xl:w-4/5">
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange"> <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange">
<a-tab-pane key="1" tab="成员"> <a-tab-pane key="1" :tab="t('routes.admin.member') ">
<BasicTable @register="registerUserTable" size="small"> <BasicTable @register="registerUserTable" size="small">
<template #toolbar>
<a-button
preIcon="ant-design:plus-circle-outlined"
type="primary"
v-auth="'System.OrganizationUnitManagement.Update'"
@click="openAddUserToOrganizationUnitModal"
>
{{ t("common.createText") }}
</a-button>
</template>>
<template #action="{ record }"> <template #action="{ record }">
<TableAction <TableAction
:actions="[ :actions="[
{ {
icon: 'ant-design:delete-outlined', icon: 'ant-design:delete-outlined',
label: '删除', label: t('common.delText'),
onClick: handleUserDelete.bind(null, record), auth:'System.OrganizationUnitManagement.Delete',
onClick: handleUserDelete.bind(null, record),
}, },
]" ]"
/> />
@ -41,13 +53,14 @@
</BasicTable> </BasicTable>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="2" tab="角色" force-render> <a-tab-pane key="2" :tab="t('routes.admin.role') " force-render>
<BasicTable @register="registerRoleTable" size="small"> <BasicTable @register="registerRoleTable" size="small">
<template #toolbar> <template #toolbar>
<a-button <a-button
preIcon="ant-design:plus-circle-outlined" preIcon="ant-design:plus-circle-outlined"
type="primary" type="primary"
@click="AddRoleToOrganizationUnitModal" v-auth="'System.OrganizationUnitManagement.Update'"
@click="openAddRoleToOrganizationUnitModal"
> >
{{ t("common.createText") }} {{ t("common.createText") }}
</a-button> </a-button>
@ -56,13 +69,13 @@
<template #action="{ record }"> <template #action="{ record }">
<TableAction <TableAction
:actions="[ :actions="[
{ {
icon: 'ant-design:delete-outlined', icon: 'ant-design:delete-outlined',
label: t('common.delText'),
label: '删除', auth:'System.OrganizationUnitManagement.Delete',
onClick: handleRoleDelete.bind(null, record), onClick: handleRoleDelete.bind(null, record),
}, },
]" ]"
/> />
</template> </template>
</BasicTable> </BasicTable>
@ -75,7 +88,10 @@
@reload="initOrganizationUnit" @reload="initOrganizationUnit"
/> />
<EditOrganizationUnit @register="registerEditOrganizationUnit" @reload="initOrganizationUnit" /> <EditOrganizationUnit @register="registerEditOrganizationUnit" @reload="initOrganizationUnit" />
<AddRoleToOrganizationUnit @register="registerAddRoleToOrganizationUnit" @reload="initOrganizationUnit" /> <AddRoleToOrganizationUnit @register="registerAddRoleToOrganizationUnit"
@reload="reloadRole" />
<AddUserToOrganizationUnit @register="registerAddUserToOrganizationUnit"
@reload="reloadUser" />
</div> </div>
</template> </template>
@ -103,7 +119,8 @@ import {
import { Tabs } from "ant-design-vue"; import { Tabs } from "ant-design-vue";
import CreateOrganizationUnit from "./CreateOrganizationUnit.vue"; import CreateOrganizationUnit from "./CreateOrganizationUnit.vue";
import EditOrganizationUnit from "./EditOrganizationUnit.vue"; import EditOrganizationUnit from "./EditOrganizationUnit.vue";
import AddRoleToOrganizationUnit from './AddRoleToOrganizationUnit.vue'; import AddRoleToOrganizationUnit from "./AddRoleToOrganizationUnit.vue";
import AddUserToOrganizationUnit from "./AddUserToOrganizationUnit.vue";
import { useModal } from "/@/components/Modal"; import { useModal } from "/@/components/Modal";
import { useMessage } from "/@/hooks/web/useMessage"; import { useMessage } from "/@/hooks/web/useMessage";
@ -121,18 +138,32 @@ export default defineComponent({
EditOrganizationUnit, EditOrganizationUnit,
BasicTable, BasicTable,
TableAction, TableAction,
AddRoleToOrganizationUnit AddRoleToOrganizationUnit,
AddUserToOrganizationUnit
}, },
setup() { setup() {
const { t } = useI18n(); const { t } = useI18n();
const { createConfirm } = useMessage(); const { createConfirm } = useMessage();
const treeData = ref<TreeOutput[]>([]); const treeData = ref<TreeOutput[]>([]);
const activeKey = ref("1"); const activeKey = ref("1");
const [registerCreateOrganizationUnit, { openModal: CreateOrganizationUnitModal }] = const [registerCreateOrganizationUnit, { openModal: CreateOrganizationUnitModal }] =useModal();
useModal();
const [registerEditOrganizationUnit, { openModal: EditOrganizationUnitModal }] = useModal(); const [registerEditOrganizationUnit, { openModal: EditOrganizationUnitModal }] = useModal();
const [registerAddRoleToOrganizationUnit, { openModal: AddRoleToOrganizationUnitModal }] = const [registerAddRoleToOrganizationUnit, { openModal: AddRoleToOrganizationUnitModal }] = useModal();
useModal(); const [registerAddUserToOrganizationUnit, { openModal: AddUserToOrganizationUnitModal }] = useModal();
let organizationUnitId: string = "";
const openAddUserToOrganizationUnitModal= ()=>{
if(organizationUnitId)
{
AddUserToOrganizationUnitModal(true,{organizationUnitId});
}
};
const openAddRoleToOrganizationUnitModal= ()=>{
if(organizationUnitId)
{
AddRoleToOrganizationUnitModal(true,{organizationUnitId});
}
};
const initOrganizationUnit = async () => { const initOrganizationUnit = async () => {
treeData.value = await getTreeAsync(); treeData.value = await getTreeAsync();
}; };
@ -188,15 +219,12 @@ export default defineComponent({
} }
}); });
}, },
icon: "ant-design:delete-outlined" icon: "ant-design:delete-outlined",
} }
]; ];
} }
let organizationUnitId: string = "";
async function handleSelect(keys) { async function handleSelect(keys) {
console.log(keys);
if (keys.length > 0) { if (keys.length > 0) {
organizationUnitId = keys[0]; organizationUnitId = keys[0];
if (activeKey.value == "1") { if (activeKey.value == "1") {
@ -251,7 +279,6 @@ export default defineComponent({
} }
}); });
const [registerRoleTable, { reload: reloadRole }] = useTable({ const [registerRoleTable, { reload: reloadRole }] = useTable({
columns: roleTableColumns, columns: roleTableColumns,
api: getRoleAsync, api: getRoleAsync,
@ -283,7 +310,6 @@ export default defineComponent({
}; };
//
const handleUserDelete = async (record: Recordable) => { const handleUserDelete = async (record: Recordable) => {
let msg = t("common.askDelete"); let msg = t("common.askDelete");
createConfirm({ createConfirm({
@ -300,7 +326,6 @@ export default defineComponent({
}); });
}; };
//
const handleRoleDelete = async (record: Recordable) => { const handleRoleDelete = async (record: Recordable) => {
let msg = t("common.askDelete"); let msg = t("common.askDelete");
createConfirm({ createConfirm({
@ -332,7 +357,13 @@ export default defineComponent({
handleRoleDelete, handleRoleDelete,
t, t,
registerAddRoleToOrganizationUnit, registerAddRoleToOrganizationUnit,
AddRoleToOrganizationUnitModal openAddRoleToOrganizationUnitModal,
getRoleAsync,
reloadRole,
reloadUser,
openAddUserToOrganizationUnitModal,
registerAddUserToOrganizationUnit,
getUserAsync
}; };
} }
}); });

113
vben271/src/views/admin/roles/AbpRole.ts

@ -1,5 +1,5 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { import {
RolesServiceProxy, RolesServiceProxy,
PagingRoleListInput, PagingRoleListInput,
@ -7,98 +7,99 @@ import {
IdentityRoleCreateDto, IdentityRoleCreateDto,
PermissionsServiceProxy, PermissionsServiceProxy,
IdInput, IdInput,
GetPermissionInput, GetPermissionInput
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import { useLoading } from '/@/components/Loading'; import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n(); const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({ const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...', tip: "Loading..."
}); });
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_roleName'), title: t("routes.admin.userManagement_roleName"),
dataIndex: 'name', dataIndex: "name"
}, },
{ {
title: t('routes.admin.roleManagement_default'), title: t("routes.admin.roleManagement_default"),
dataIndex: 'isDefault', dataIndex: "isDefault",
slots: { customRender: 'category' }, slots: { customRender: "category" }
}, }
]; ];
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, }
]; ];
export const createFormSchema: FormSchema[] = [ export const createFormSchema: FormSchema[] = [
{ {
field: 'name', field: "name",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { span: 18 }, colProps: { span: 18 }
}, },
{ {
field: 'isDefault', field: "isDefault",
component: 'RadioGroup', component: "RadioGroup",
label: t('routes.admin.roleManagement_default'), label: t("routes.admin.roleManagement_default"),
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, },
defaultValue: '0', defaultValue: "0",
componentProps: { componentProps: {
options: [ options: [
{ {
label: t('common.true'), label: t("common.true"),
value: '1', value: "1"
}, },
{ {
label: t('common.false'), label: t("common.false"),
value: '0', value: "0"
}, }
], ]
}, }
}, }
]; ];
export const editFormSchema: FormSchema[] = [ export const editFormSchema: FormSchema[] = [
{ {
field: 'name', field: "name",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { span: 18 }, colProps: { span: 18 }
}, },
{ {
field: 'isDefault', field: "isDefault",
component: 'RadioGroup', component: "RadioGroup",
label: t('routes.admin.roleManagement_default'), label: t("routes.admin.roleManagement_default"),
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, },
componentProps: { componentProps: {
options: [ options: [
{ {
label: t('common.true'), label: t("common.true"),
value: '1', value: "1"
}, },
{ {
label: t('common.false'), label: t("common.false"),
value: '0', value: "0"
}, }
], ]
}, }
}, }
]; ];
/** /**
@ -123,7 +124,7 @@ export async function deleteRoleAsync({ roleId, reload }) {
request.id = roleId; request.id = roleId;
await _roleServiceProxy.delete(request); await _roleServiceProxy.delete(request);
closeFullLoading(); closeFullLoading();
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
reload(); reload();
} catch (error) { } catch (error) {
closeFullLoading(); closeFullLoading();
@ -139,11 +140,11 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
await validate(); await validate();
let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto(); let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto();
requestBody.name = request.name; requestBody.name = request.name;
request.isDefault == '1' ? (requestBody.isDefault = true) : (requestBody.isDefault = false); request.isDefault == "1" ? (requestBody.isDefault = true) : (requestBody.isDefault = false);
const _roleServiceProxy = new RolesServiceProxy(); const _roleServiceProxy = new RolesServiceProxy();
await _roleServiceProxy.create(requestBody); await _roleServiceProxy.create(requestBody);
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
closeModal(); closeModal();
} }
@ -155,7 +156,7 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
export async function getRolePermissionAsync(roleName: string) { export async function getRolePermissionAsync(roleName: string) {
const _permissionsServiceProxy = new PermissionsServiceProxy(); const _permissionsServiceProxy = new PermissionsServiceProxy();
const request = new GetPermissionInput(); const request = new GetPermissionInput();
request.providerName = 'R'; request.providerName = "R";
request.providerKey = roleName; request.providerKey = roleName;
return await _permissionsServiceProxy.tree(request); return await _permissionsServiceProxy.tree(request);
} }

183
vben271/src/views/admin/roles/AbpRole.vue

@ -3,7 +3,7 @@
<BasicTable @register="registerTable" size="small"> <BasicTable @register="registerTable" size="small">
<template #category="{ record }"> <template #category="{ record }">
<Tag :color="record.isDefault ? 'red' : 'green'"> <Tag :color="record.isDefault ? 'red' : 'green'">
{{ record.isDefault ? '是' : '否' }} {{ record.isDefault ? "是" : "否" }}
</Tag> </Tag>
</template> </template>
@ -14,7 +14,7 @@
@click="openCreateAbpRoleModal" @click="openCreateAbpRoleModal"
v-auth="'AbpIdentity.Roles.Create'" v-auth="'AbpIdentity.Roles.Create'"
> >
{{ t('common.createText') }} {{ t("common.createText") }}
</a-button> </a-button>
</template> </template>
@ -65,101 +65,102 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync, deleteRoleAsync } from "/@/views/admin/roles/AbpRole"; import { tableColumns, searchFormSchema, getTableListAsync, deleteRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useModal } from '/@/components/Modal'; import { useModal } from "/@/components/Modal";
import CreateAbpRole from './CreateAbpRole.vue'; import CreateAbpRole from "./CreateAbpRole.vue";
import PermissionAbpRole from './PermissionAbpRole.vue'; import PermissionAbpRole from "./PermissionAbpRole.vue";
import EditAbpRole from './EditAbpRole.vue'; import EditAbpRole from "./EditAbpRole.vue";
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from "/@/hooks/web/useMessage";
import { useDrawer } from '/@/components/Drawer'; import { useDrawer } from "/@/components/Drawer";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { Tag } from 'ant-design-vue'; import { Tag } from "ant-design-vue";
export default defineComponent({
name: 'AbpUser',
components: {
BasicTable,
TableAction,
CreateAbpRole,
PermissionAbpRole,
EditAbpRole,
Tag,
},
setup() {
const { createConfirm } = useMessage();
const { t } = useI18n();
const [registerPermissionAbpRoleModal, { openDrawer: openPermissionAbpRoleDrawer }] =
useDrawer();
const [registerCreateAbpRoleModal, { openModal: openCreateAbpRoleModal }] = useModal(); export default defineComponent({
name: "AbpUser",
components: {
BasicTable,
TableAction,
CreateAbpRole,
PermissionAbpRole,
EditAbpRole,
Tag
},
setup() {
const { createConfirm } = useMessage();
const { t } = useI18n();
const [registerPermissionAbpRoleModal, { openDrawer: openPermissionAbpRoleDrawer }] =
useDrawer();
const [registerEditAbpRoleModal, { openModal: openEditAbpRoleModal }] = useModal(); const [registerCreateAbpRoleModal, { openModal: openCreateAbpRoleModal }] = useModal();
// table const [registerEditAbpRoleModal, { openModal: openEditAbpRoleModal }] = useModal();
const [registerTable, { reload }] = useTable({
columns: tableColumns, // table
formConfig: { const [registerTable, { reload }] = useTable({
labelWidth: 70, columns: tableColumns,
schemas: searchFormSchema, formConfig: {
}, labelWidth: 70,
api: getTableListAsync, schemas: searchFormSchema
showTableSetting: true, },
useSearchForm: true, api: getTableListAsync,
bordered: true, showTableSetting: true,
canResize: true, useSearchForm: true,
showIndexColumn: true, bordered: true,
actionColumn: { canResize: true,
width: 200, showIndexColumn: true,
title: t('common.action'), actionColumn: {
dataIndex: 'action', width: 200,
slots: { title: t("common.action"),
customRender: 'action', dataIndex: "action",
}, slots: {
fixed: 'right', customRender: "action"
}, },
}); fixed: "right"
}
});
// //
const handleEdit = (record: Recordable) => { const handleEdit = (record: Recordable) => {
openEditAbpRoleModal(true, { openEditAbpRoleModal(true, {
record: record, record: record
}); });
}; };
// //
const handlePermission = (record: Recordable) => { const handlePermission = (record: Recordable) => {
openPermissionAbpRoleDrawer(true, { openPermissionAbpRoleDrawer(true, {
record: record, record: record
}); });
}; };
// //
const handleDelete = async (record: Recordable) => { const handleDelete = async (record: Recordable) => {
let msg = t('common.askDelete'); let msg = t("common.askDelete");
createConfirm({ createConfirm({
iconType: 'warning', iconType: "warning",
title: t('common.tip'), title: t("common.tip"),
content: msg, content: msg,
onOk: async () => { onOk: async () => {
await deleteRoleAsync({ roleId: record.id, reload }); await deleteRoleAsync({ roleId: record.id, reload });
}, }
}); });
}; };
return { return {
t, t,
registerTable, registerTable,
handleEdit, handleEdit,
handleDelete, handleDelete,
handlePermission, handlePermission,
getTableListAsync, getTableListAsync,
registerCreateAbpRoleModal, registerCreateAbpRoleModal,
openCreateAbpRoleModal, openCreateAbpRoleModal,
registerPermissionAbpRoleModal, registerPermissionAbpRoleModal,
registerEditAbpRoleModal, registerEditAbpRoleModal,
reload, reload
}; };
}, }
}); });
</script> </script>

94
vben271/src/views/admin/roles/CreateAbpRole.vue

@ -11,58 +11,58 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { createFormSchema, createRoleAsync } from '/@/views/admin/roles/AbpRole'; import { createFormSchema, createRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({ export default defineComponent({
name: 'CreateAbpRole', name: "CreateAbpRole",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
emits: ['reload', 'register'], emits: ["reload", "register"],
setup(_, { emit }) { setup(_, { emit }) {
// //
// defineEmit(['reload']); // defineEmit(['reload']);
// const ctx = useContext(); // const ctx = useContext();
const { t } = useI18n(); const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({ const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: createFormSchema, schemas: createFormSchema,
showActionButtonGroup: false, showActionButtonGroup: false
}); });
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(); const [registerModal, { changeOkLoading, closeModal }] = useModalInner();
// //
const submit = async () => { const submit = async () => {
try { try {
const request = getFieldsValue(); const request = getFieldsValue();
await createRoleAsync({ request, changeOkLoading, validate, closeModal }); await createRoleAsync({ request, changeOkLoading, validate, closeModal });
await resetFields(); await resetFields();
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
closeModal(); closeModal();
}; };
return { return {
t, t,
registerModal, registerModal,
registerUserForm, registerUserForm,
submit, submit,
cancel, cancel
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

118
vben271/src/views/admin/roles/EditAbpRole.vue

@ -10,70 +10,70 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { editFormSchema, updateRoleAsync } from '/@/views/admin/roles/AbpRole'; import { editFormSchema, updateRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
import { import {
IdentityRoleDto, IdentityRoleDto,
UpdateRoleInput, UpdateRoleInput,
IdentityRoleUpdateDto, IdentityRoleUpdateDto
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
export default defineComponent({ export default defineComponent({
name: 'EditAbpRole', name: "EditAbpRole",
components: { components: {
BasicModal, BasicModal,
BasicForm, BasicForm
}, },
emits: ['reload', 'register'], emits: ["reload", "register"],
setup(_, { emit }) { setup(_, { emit }) {
// //
// defineEmit(['reload']); // defineEmit(['reload']);
// const ctx = useContext(); // const ctx = useContext();
const { t } = useI18n(); const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, setFieldsValue }] = useForm({ const [registerUserForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: editFormSchema, schemas: editFormSchema,
showActionButtonGroup: false, showActionButtonGroup: false
}); });
let currentRoleInfo = new IdentityRoleDto(); let currentRoleInfo = new IdentityRoleDto();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => { const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => {
currentRoleInfo = data.record; currentRoleInfo = data.record;
setFieldsValue({ setFieldsValue({
name: data.record.name, name: data.record.name,
isDefault: data.record.isDefault ? '1' : '0', isDefault: data.record.isDefault ? "1" : "0"
});
}); });
});
// //
const submit = async () => { const submit = async () => {
try { try {
const request = getFieldsValue(); const request = getFieldsValue();
let role = new UpdateRoleInput(); let role = new UpdateRoleInput();
role.roleId = currentRoleInfo.id; role.roleId = currentRoleInfo.id;
role.roleInfo = new IdentityRoleUpdateDto(); role.roleInfo = new IdentityRoleUpdateDto();
role.roleInfo.name = request.name; role.roleInfo.name = request.name;
role.roleInfo.isDefault = request.isDefault == 1; role.roleInfo.isDefault = request.isDefault == 1;
role.roleInfo.isPublic = currentRoleInfo.isPublic; role.roleInfo.isPublic = currentRoleInfo.isPublic;
role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp; role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp;
await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal }); await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal });
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
return { return {
t, t,
registerModal, registerModal,
registerUserForm, registerUserForm,
submit, submit
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped></style>

2
vben271/src/views/admin/settings/Setting.ts

@ -1,4 +1,4 @@
import { SettingsServiceProxy } from '/@/services/ServiceProxies'; import { SettingsServiceProxy } from "/@/services/ServiceProxies";
/** /**
* settings * settings

227
vben271/src/views/admin/users/AbpUser.ts

@ -1,6 +1,6 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import moment from 'moment'; import moment from "moment";
import { import {
PagingUserListInput, PagingUserListInput,
UsersServiceProxy, UsersServiceProxy,
@ -8,198 +8,199 @@ import {
IdentityRoleDtoListResultDto, IdentityRoleDtoListResultDto,
RolesServiceProxy, RolesServiceProxy,
LockUserInput, LockUserInput,
IdInput, IdInput
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import { useLoading } from '/@/components/Loading'; import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n(); const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({ const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...', tip: "Loading..."
}); });
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_userName'), title: t("routes.admin.userManagement_userName"),
dataIndex: 'userName', dataIndex: "userName"
}, },
{ {
title: t('routes.admin.userManagement_name'), title: t("routes.admin.userManagement_name"),
dataIndex: 'name', dataIndex: "name"
}, },
{ {
title: t('routes.admin.userManagement_email'), title: t("routes.admin.userManagement_email"),
dataIndex: 'email', dataIndex: "email"
}, },
{ {
title: t('routes.admin.userManagement_phone'), title: t("routes.admin.userManagement_phone"),
dataIndex: 'phoneNumber', dataIndex: "phoneNumber"
}, },
{ {
title: t('common.status'), title: t("common.status"),
dataIndex: 'isActive', dataIndex: "isActive",
slots: { customRender: 'isActive' }, slots: { customRender: "isActive" }
}, },
{ {
title: t('routes.admin.userManagement_createTime'), title: t("routes.admin.userManagement_createTime"),
dataIndex: 'creationTime', dataIndex: "creationTime",
customRender: ({ text }) => { customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss'); return moment(text).format("YYYY-MM-DD HH:mm:ss");
}, }
}, }
]; ];
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.userManagement_userName'), label: t("routes.admin.userManagement_userName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, }
]; ];
export const createFormSchema: FormSchema[] = [ export const createFormSchema: FormSchema[] = [
{ {
field: 'userName', field: "userName",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_userName'), label: t("routes.admin.userManagement_userName"),
labelWidth: 85, labelWidth: 85,
required: true, required: true,
colProps: { colProps: {
span: 12, span: 12
}, },
componentProps: { componentProps: {
autocomplete: 'off', autocomplete: "off"
}, }
}, },
{ {
field: 'name', field: "name",
component: 'Input', component: "Input",
label: t('routes.admin.roleManagement_name'), label: t("routes.admin.roleManagement_name"),
labelWidth: 130, labelWidth: 130,
required: true, required: true,
colProps: { colProps: {
span: 12, span: 12
}, },
componentProps: { componentProps: {
autocomplete: 'off', autocomplete: "off"
}, }
}, },
{ {
field: 'email', field: "email",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_email'), label: t("routes.admin.userManagement_email"),
required: true, required: true,
labelWidth: 85, labelWidth: 85,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'phoneNumber', field: "phoneNumber",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_phone'), label: t("routes.admin.userManagement_phone"),
required: false, required: false,
labelWidth: 130, labelWidth: 130,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'password', field: "password",
component: 'InputPassword', component: "InputPassword",
label: t('routes.admin.userManagement_password'), label: t("routes.admin.userManagement_password"),
required: true, required: true,
labelWidth: 85, labelWidth: 85,
colProps: { colProps: {
span: 12, span: 12
}, },
componentProps: { componentProps: {
autocomplete: 'off', autocomplete: "off"
}, }
}, },
{ {
field: 'confirmPassword', field: "confirmPassword",
component: 'InputPassword', component: "InputPassword",
componentProps: { componentProps: {
autocomplete: 'off', autocomplete: "off"
}, },
label: t('routes.admin.userManagement_confirm_password'), label: t("routes.admin.userManagement_confirm_password"),
required: true, required: true,
labelWidth: 130, labelWidth: 130,
colProps: { colProps: {
span: 12, span: 12
}, }
}, }
]; ];
export const editFormSchema: FormSchema[] = [ export const editFormSchema: FormSchema[] = [
{ {
field: 'userName', field: "userName",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_userName'), label: t("routes.admin.userManagement_userName"),
labelWidth: 85, labelWidth: 85,
required: true, required: true,
colProps: { colProps: {
span: 12, span: 12
}, },
componentProps: { componentProps: {
autocomplete: 'off', autocomplete: "off",
disabled: true, disabled: true
}, }
}, },
{ {
field: 'name', field: "name",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_name'), label: t("routes.admin.userManagement_name"),
labelWidth: 130, labelWidth: 130,
required: true, required: true,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'email', field: "email",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_email'), label: t("routes.admin.userManagement_email"),
required: true, required: true,
labelWidth: 85, labelWidth: 85,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'phoneNumber', field: "phoneNumber",
component: 'Input', component: "Input",
label: t('routes.admin.userManagement_phone'), label: t("routes.admin.userManagement_phone"),
required: false, required: false,
labelWidth: 130, labelWidth: 130,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'password', field: "password",
component: 'InputPassword', component: "InputPassword",
label: t('routes.admin.userManagement_password'), label: t("routes.admin.userManagement_password"),
required: false, required: false,
labelWidth: 85, labelWidth: 85,
colProps: { colProps: {
span: 12, span: 12
}, }
}, },
{ {
field: 'confirmPassword', field: "confirmPassword",
component: 'InputPassword', component: "InputPassword",
label: t('routes.admin.userManagement_confirm_password'), label: t("routes.admin.userManagement_confirm_password"),
required: false, required: false,
labelWidth: 130, labelWidth: 130,
colProps: { colProps: {
span: 12, span: 12
}, }
}, }
]; ];
/** /**
@ -219,16 +220,16 @@ export async function getTableListAsync(
* @param params * @param params
* @returns * @returns
*/ */
export function exportAsync({request}) { export function exportAsync({ request }) {
openFullLoading(); openFullLoading();
const _userServiceProxy = new UsersServiceProxy(); const _userServiceProxy = new UsersServiceProxy();
_userServiceProxy.export(request).then(res=>{ _userServiceProxy.export(request).then(res => {
const a = document.createElement('a'); const a = document.createElement("a");
a.href = URL.createObjectURL(res.data); a.href = URL.createObjectURL(res.data);
a.download = '用户列表导出.xlsx'; a.download = "用户列表导出.xlsx";
a.click(); a.click();
closeFullLoading(); closeFullLoading();
}); });
} }
/** /**
@ -261,18 +262,18 @@ export async function createUserAsync({
changeOkLoading, changeOkLoading,
validate, validate,
closeModal, closeModal,
resetFields, resetFields
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
if (request.password != request.confirmPassword) { if (request.password != request.confirmPassword) {
message.error('两次密码输入不一致'); message.error("两次密码输入不一致");
throw new Error('两次密码输入不一致'); throw new Error("两次密码输入不一致");
} }
const _userServiceProxy = new UsersServiceProxy(); const _userServiceProxy = new UsersServiceProxy();
await _userServiceProxy.create(request); await _userServiceProxy.create(request);
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
resetFields(); resetFields();
closeModal(); closeModal();
} }
@ -289,7 +290,7 @@ export async function deleteUserAsync({ userId, reload }) {
request.id = userId; request.id = userId;
await _userServiceProxy.delete(request); await _userServiceProxy.delete(request);
closeFullLoading(); closeFullLoading();
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
reload(); reload();
} catch (error) { } catch (error) {
closeFullLoading(); closeFullLoading();
@ -305,7 +306,7 @@ export async function updateUserAsync({
changeOkLoading, changeOkLoading,
validate, validate,
closeModal, closeModal,
resetFields, resetFields
}) { }) {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
@ -314,7 +315,7 @@ export async function updateUserAsync({
await _userServiceProxy.update(request); await _userServiceProxy.update(request);
changeOkLoading(false); changeOkLoading(false);
resetFields(); resetFields();
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
closeModal(); closeModal();
} }

162
vben271/src/views/admin/users/CreateAbpUser.vue

@ -25,7 +25,7 @@
v-for="(item, index) in itemRolesRef" v-for="(item, index) in itemRolesRef"
:key="index" :key="index"
:value="item.name" :value="item.name"
>{{ item.name }} >{{ item.name }}
</a-checkbox> </a-checkbox>
</a-col> </a-col>
</a-row> </a-row>
@ -37,88 +37,88 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { Tabs } from 'ant-design-vue'; import { Tabs } from "ant-design-vue";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { createFormSchema, getAllRoleAsync, createUserAsync } from '/@/views/admin/users/AbpUser'; import { createFormSchema, getAllRoleAsync, createUserAsync } from "/@/views/admin/users/AbpUser";
import { IdentityRoleDto, IdentityUserCreateDto } from '/@/services/ServiceProxies'; import { IdentityRoleDto, IdentityUserCreateDto } from "/@/services/ServiceProxies";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({ export default defineComponent({
name: 'CreateAbpUser', name: "CreateAbpUser",
components: { components: {
BasicModal, BasicModal,
Tabs, Tabs,
TabPane: Tabs.TabPane, TabPane: Tabs.TabPane,
BasicForm, BasicForm
}, },
emits: ['reload', 'register'], emits: ["reload", "register"],
setup(_, { emit }) { setup(_, { emit }) {
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(); const [registerModal, { changeOkLoading, closeModal }] = useModalInner();
const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({ const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: createFormSchema, schemas: createFormSchema,
showActionButtonGroup: false, showActionButtonGroup: false
}); });
let itemRoles: IdentityRoleDto[] = []; let itemRoles: IdentityRoleDto[] = [];
let defaultRoles: string[] = []; let defaultRoles: string[] = [];
// //
let defaultRolesRef = ref(defaultRoles); let defaultRolesRef = ref(defaultRoles);
let itemRolesRef = ref(itemRoles); let itemRolesRef = ref(itemRoles);
const visibleChange = async (visible: boolean) => { const visibleChange = async (visible: boolean) => {
if (visible) { if (visible) {
itemRolesRef.value.length = 0; itemRolesRef.value.length = 0;
defaultRolesRef.value.splice(0, defaultRolesRef.value.length); defaultRolesRef.value.splice(0, defaultRolesRef.value.length);
let roles = await getAllRoleAsync(); let roles = await getAllRoleAsync();
roles.items?.forEach((e) => { roles.items?.forEach((e) => {
itemRolesRef.value.push(e); itemRolesRef.value.push(e);
}); });
} else { } else {
await resetFields(); await resetFields();
itemRolesRef.value.length = 0; itemRolesRef.value.length = 0;
defaultRolesRef.value.length = 0; defaultRolesRef.value.length = 0;
} }
}; };
// //
const submit = async () => { const submit = async () => {
try { try {
let request = getFieldsValue() as IdentityUserCreateDto; let request = getFieldsValue() as IdentityUserCreateDto;
request.roleNames = defaultRolesRef.value; request.roleNames = defaultRolesRef.value;
await createUserAsync({ await createUserAsync({
request, request,
changeOkLoading, changeOkLoading,
validate, validate,
closeModal, closeModal,
resetFields, resetFields
}); });
defaultRolesRef.value.length = 0; defaultRolesRef.value.length = 0;
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
closeModal(); closeModal();
}; };
return { return {
t, t,
cancel, cancel,
registerModal, registerModal,
registerUserForm, registerUserForm,
submit, submit,
visibleChange, visibleChange,
defaultRolesRef, defaultRolesRef,
itemRolesRef, itemRolesRef
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.ant-checkbox-wrapper + .ant-checkbox-wrapper { .ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0; margin-left: 0;
} }
</style> </style>

233
vben271/src/views/admin/users/EditAbpUser.vue

@ -25,7 +25,9 @@
v-for="(item, index) in rolesRef" v-for="(item, index) in rolesRef"
:key="index" :key="index"
:value="item.name" :value="item.name"
>{{ item.name }}</a-checkbox >
{{ item.name }}
</a-checkbox
> >
</a-col> </a-col>
</a-row> </a-row>
@ -37,128 +39,129 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from "vue";
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from '/@/components/Form/index'; import { BasicForm, useForm } from "/@/components/Form/index";
import { Tabs } from 'ant-design-vue'; import { Tabs } from "ant-design-vue";
import { import {
editFormSchema, editFormSchema,
getAllRoleAsync, getAllRoleAsync,
updateUserAsync, updateUserAsync,
getRolesByUserIdAsync, getRolesByUserIdAsync
} from '/@/views/admin/users/AbpUser'; } from "/@/views/admin/users/AbpUser";
import { import {
IdentityRoleDto, IdentityRoleDto,
IdentityUserDto, IdentityUserDto,
UpdateUserInput, UpdateUserInput,
IdentityUserUpdateDto, IdentityUserUpdateDto
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({
name: 'EditAbpUser', export default defineComponent({
components: { name: "EditAbpUser",
BasicModal, components: {
BasicForm, BasicModal,
Tabs, BasicForm,
TabPane: Tabs.TabPane, Tabs,
}, TabPane: Tabs.TabPane
emits: ['reload', 'register'], },
setup(_, { emit }) { emits: ["reload", "register"],
const [registerUserForm, { getFieldsValue, validate, setFieldsValue, resetFields }] = useForm( setup(_, { emit }) {
{ const [registerUserForm, { getFieldsValue, validate, setFieldsValue, resetFields }] = useForm(
labelWidth: 120, {
schemas: editFormSchema, labelWidth: 120,
showActionButtonGroup: false, schemas: editFormSchema,
} showActionButtonGroup: false
); }
const { t } = useI18n(); );
let currentUserInfo = new IdentityUserDto(); const { t } = useI18n();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => { let currentUserInfo = new IdentityUserDto();
currentUserInfo = data.record; const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => {
setFieldsValue({ currentUserInfo = data.record;
name: data.record.name, setFieldsValue({
userName: data.record.userName, name: data.record.name,
email: data.record.email, userName: data.record.userName,
phoneNumber: data.record.phoneNumber, email: data.record.email,
}); phoneNumber: data.record.phoneNumber
}); });
});
let roles: IdentityRoleDto[] = []; let roles: IdentityRoleDto[] = [];
let defaultRoles: string[] = []; let defaultRoles: string[] = [];
let rolesRef = ref(roles); let rolesRef = ref(roles);
let defaultRolesRef = ref(defaultRoles); let defaultRolesRef = ref(defaultRoles);
const visibleChange = async (visible: boolean) => { const visibleChange = async (visible: boolean) => {
if (visible) { if (visible) {
const roles = await getAllRoleAsync(); const roles = await getAllRoleAsync();
const userRoles = await getRolesByUserIdAsync(currentUserInfo.id as string); const userRoles = await getRolesByUserIdAsync(currentUserInfo.id as string);
userRoles.items?.forEach((e) => { userRoles.items?.forEach((e) => {
defaultRolesRef.value.push(e.name as string); defaultRolesRef.value.push(e.name as string);
}); });
roles.items?.forEach((e) => { roles.items?.forEach((e) => {
rolesRef.value.push(e); rolesRef.value.push(e);
}); });
} else { } else {
rolesRef.value.splice(0, rolesRef.value.length); rolesRef.value.splice(0, rolesRef.value.length);
defaultRolesRef.value.splice(0, defaultRolesRef.value.length); defaultRolesRef.value.splice(0, defaultRolesRef.value.length);
} }
}; };
const submit = async () => { const submit = async () => {
try { try {
let request = getFieldsValue(); let request = getFieldsValue();
if (request.password != request.confirmPassword) { if (request.password != request.confirmPassword) {
message.error(t('routes.admin.editPasswordMessage')); message.error(t("routes.admin.editPasswordMessage"));
} }
let updateUserInput = new UpdateUserInput(); let updateUserInput = new UpdateUserInput();
let userInfo = new IdentityUserUpdateDto(); let userInfo = new IdentityUserUpdateDto();
userInfo.userName = request.userName; userInfo.userName = request.userName;
userInfo.name = request.name; userInfo.name = request.name;
userInfo.surname = currentUserInfo.surname; userInfo.surname = currentUserInfo.surname;
userInfo.email = request.email; userInfo.email = request.email;
userInfo.phoneNumber = request.phoneNumber; userInfo.phoneNumber = request.phoneNumber;
userInfo.lockoutEnabled = currentUserInfo.lockoutEnabled; userInfo.lockoutEnabled = currentUserInfo.lockoutEnabled;
userInfo.concurrencyStamp = currentUserInfo.concurrencyStamp; userInfo.concurrencyStamp = currentUserInfo.concurrencyStamp;
userInfo.roleNames = defaultRolesRef.value; userInfo.roleNames = defaultRolesRef.value;
userInfo.password = request.password; userInfo.password = request.password;
updateUserInput.userId = currentUserInfo.id; updateUserInput.userId = currentUserInfo.id;
updateUserInput.userInfo = userInfo; updateUserInput.userInfo = userInfo;
await updateUserAsync({ await updateUserAsync({
request: updateUserInput, request: updateUserInput,
changeOkLoading, changeOkLoading,
validate, validate,
closeModal, closeModal,
resetFields, resetFields
}); });
emit('reload'); emit("reload");
} catch (error) { } catch (error) {
changeOkLoading(false); changeOkLoading(false);
} }
}; };
const cancel = () => { const cancel = () => {
resetFields(); resetFields();
closeModal(); closeModal();
}; };
return { return {
registerModal, registerModal,
registerUserForm, registerUserForm,
submit, submit,
rolesRef, rolesRef,
visibleChange, visibleChange,
defaultRolesRef, defaultRolesRef,
cancel, cancel,
t, t
}; };
}, }
}); });
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.ant-checkbox-wrapper + .ant-checkbox-wrapper { .ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0; margin-left: 0;
} }
</style> </style>

Loading…
Cancel
Save