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);
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
{
public class DataDictionaryDomainException : UserFriendlyException
public class DataDictionaryDomainException : BusinessException
{
public DataDictionaryDomainException(string message, string code = null, string details = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details,
innerException, logLevel)
public DataDictionaryDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException,
logLevel
)
{
}
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(
serializationInfo, context)
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(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 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 =>
{
options.Resources
.Add<DataDictionaryManagementResource>("en")
.Add<DataDictionaryManagementResource>(DataDictionaryManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/DataDictionaryManagement");
});
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
{
//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:Create": "Create",
"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:Create": "创建",
"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 Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.Domain.Services;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
@ -22,22 +22,28 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
_cache = cache;
}
public async Task<DataDictionaryDto> FindByIdAsync(
Guid id,
CancellationToken cancellationToken = default)
{
var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null);
return await _cache.GetOrAddAsync(cacheKey,
return await _cache.GetOrAddAsync
(
cacheKey,
async () =>
{
var entity =
await _dataDictionaryRepository.FindByIdAsync(id, true,
cancellationToken);
await _dataDictionaryRepository.FindByIdAsync
(
id,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken);
},
token: cancellationToken
);
}
public async Task<DataDictionaryDto> FindByCodeAsync(
@ -45,14 +51,22 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
CancellationToken cancellationToken = default)
{
var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code);
return await _cache.GetOrAddAsync(cacheKey,
return await _cache.GetOrAddAsync
(
cacheKey,
async () =>
{
var entity =
await _dataDictionaryRepository.FindByCodeAsync(code, true,
cancellationToken);
await _dataDictionaryRepository.FindByCodeAsync
(
code,
true,
cancellationToken
);
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="displayText"></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);
return _dataDictionaryRepository.InsertAsync(entity);
Check.NotNullOrWhiteSpace(code, nameof(code));
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>
@ -77,36 +102,47 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="description"></param>
/// <param name="order"></param>
/// <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 description,
int order)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
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);
}
/// <summary>
/// 设置字典明细状态
/// </summary>
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId,
Guid dataDictionayDetailId, bool isEnabled)
public async Task<DataDictionary> SetStatus(
Guid dataDictionaryId,
Guid dataDictionayDetailId,
bool isEnabled)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail)
{
throw new DataDictionaryDomainException(message: $"字典项不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
}
detail.SetIsEnabled(isEnabled);
@ -125,14 +161,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
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);
}
@ -140,27 +182,29 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail)
{
throw new DataDictionaryDomainException(message: $"字典项不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
}
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
public async Task<DataDictionary> UpdateAsync(Guid dataDictionaryId,
public async Task<DataDictionary> UpdateAsync(
Guid dataDictionaryId,
string displayText,
string description)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
entity.Update(dataDictionaryId,displayText,description);
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
entity.Update(dataDictionaryId, displayText, description);
return await _dataDictionaryRepository.UpdateAsync(entity);
}
/// <summary>
/// 删除字典类型
/// </summary>
@ -170,13 +214,14 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(id);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id);
if (detail !=null )
if (detail != null)
{
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
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"
}
}
}
// 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));
break;
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",
"texts": {
"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",
"texts": {
"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 =>
{
options.Resources
.Add<NotificationManagementResource>("en")
.Add<NotificationManagementResource>(NotificationManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/NotificationManagement");
});
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
{
//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
{
public class NotificationManagementDomainException : UserFriendlyException
public class NotificationManagementDomainException : BusinessException
{
public NotificationManagementDomainException(string message, string code = null, string details = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details,
innerException, logLevel)
public NotificationManagementDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException,
logLevel
)
{
}
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) :
base(serializationInfo, context)
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext 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})
{
throw new NotificationManagementDomainException("消息接收人不能为空");
throw new NotificationManagementDomainException(NotificationManagementErrorCodes.ReceiverNotNull);
}
var senderId = Guid.Empty;
@ -113,7 +113,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
public async Task SetReadAsync(Guid id, Guid receiveId)
{
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)
{
// 如果类型是广播消息,用户设置为已读,在插入一条数据
@ -124,7 +124,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
var notificationSubscription =
notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId);
if (notificationSubscription == null)
throw new NotificationManagementDomainException(message: "当前用户未订阅该消息");
throw new NotificationManagementDomainException(NotificationManagementErrorCodes.UserUnSubscription);
notificationSubscription.SetRead();
}

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

@ -136,9 +136,6 @@ namespace Lion.AbpPro
/// <param name="context"></param>
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)); });
}

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

@ -13,7 +13,7 @@
"Hangfire": "Information",
"DotNetCore.CAP": "Information",
"Serilog.AspNetCore": "Information",
"Microsoft.EntityFrameworkCore": "Information"
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"WriteTo": [
@ -34,7 +34,7 @@
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
},
"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": {
"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"));
var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement"));
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
// multiTenancySide: MultiTenancySides.Host 只有host租户才有权限
var identityServerManagementGroup =
context.AddGroup(AbpProPermissions.IdentityServer.IdentityServerManagement, L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host);
context.AddGroup
(
AbpProPermissions.IdentityServer.IdentityServerManagement,
L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host
);
var clientManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.Client.Default,
L("Permission:IdentityServerManagement:Client"),multiTenancySide: MultiTenancySides.Host);
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Create,
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 clientManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.Client.Default,
L("Permission:IdentityServerManagement:Client"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Create,
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,
L("Permission:IdentityServerManagement:ApiResource"),multiTenancySide: MultiTenancySides.Host);
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Create,
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);
L("Permission:IdentityServerManagement:ApiResource"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Create,
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,
L("Permission:IdentityServerManagement:ApiScope"),multiTenancySide: MultiTenancySides.Host);
apiScopeManagment.AddChild(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 apiScopeManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.ApiScope.Default,
L("Permission:IdentityServerManagement:ApiScope"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
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,
L("Permission:IdentityServerManagement:IdentityResources"),multiTenancySide: MultiTenancySides.Host);
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Create,
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);
L("Permission:IdentityServerManagement:IdentityResources"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Create,
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
}

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 ES = Default + ".ES";
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.Providers;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Extension.System;
using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration;
@ -13,11 +14,11 @@ using Nest;
namespace Lion.AbpPro.ElasticSearchs
{
[Authorize(Policy = AbpProPermissions.SystemManagement.ES)]
public class LionAbpProLogAppService : ElasticsearchBasicService,
ILionAbpProLogAppService
public class LionAbpProLogAppService : ElasticsearchBasicService,ILionAbpProLogAppService
{
private readonly IConfiguration _configuration;
// 时区
private const string TimeZone = "Asia/Shanghai";
public LionAbpProLogAppService(
IElasticsearchProvider elasticsearchProvider,
IConfiguration configuration) : base(elasticsearchProvider)
@ -25,49 +26,54 @@ namespace Lion.AbpPro.ElasticSearchs
_configuration = configuration;
}
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(
PagingElasticSearchLogInput input)
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(PagingElasticSearchLogInput input)
{
var IndexName =
_configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
var IndexName = _configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
// 默认查询当天
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??
DateTime.Now.Date.AddMilliseconds(-1);
input.EndCreationTime =
input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??
DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
var mustFilters =
new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>,
QueryContainer>>
{
t => t.DateRange(f =>
f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai")
.GreaterThanOrEquals(input.StartCreationTime.Value)),
t => t.DateRange(
f => f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai")
.LessThanOrEquals(input.EndCreationTime.Value))
};
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??DateTime.Now.Date.AddMilliseconds(-1);
input.EndCreationTime =input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
var mustFilters = new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, QueryContainer>>();
if (input.StartCreationTime.HasValue)
{
input.StartCreationTime = input.StartCreationTime.ToCurrentDateMaxDateTime();
mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).GreaterThanOrEquals(input.StartCreationTime)));
}
if (input.EndCreationTime.HasValue)
{
input.EndCreationTime = input.EndCreationTime.ToNextSecondDateTime();
mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).LessThanOrEquals(input.EndCreationTime)));
}
if (!string.IsNullOrWhiteSpace(input.Filter))
{
mustFilters.Add(t =>
t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim())));
mustFilters.Add
(
t =>t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))
);
}
var result = await Client.SearchAsync<PagingElasticSearchLogDto>(e => e
.Index(IndexName)
.From(input.SkipCount)
.Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters))));
var result = await Client.SearchAsync<PagingElasticSearchLogDto>
(
e => e
.Index(IndexName)
.From(input.SkipCount)
.Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))
);
if (result.HitsMetadata != null)
{
return new CustomePagedResultDto<PagingElasticSearchLogOutput>(
return new CustomePagedResultDto<PagingElasticSearchLogOutput>
(
result.HitsMetadata.Total.Value,
ObjectMapper
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>(
result.Documents.ToList()));
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>
(
result.Documents.ToList()
)
);
}
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.Threading.Tasks;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.IdentityServers.ApiResources.Dtos;
using Lion.AbpPro.OrganizationUnits.Dto;
using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace Lion.AbpPro.OrganizationUnits;
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Default)]
public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitAppService
{
private readonly OrganizationUnitManager _organizationUnitManager;
@ -34,6 +36,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
return ConvertToTree(organizationUnitDtos);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task CreateAsync(CreateOrganizationUnitInput input)
{
var entity = new OrganizationUnit
@ -46,11 +49,13 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
await _organizationUnitManager.CreateAsync(entity);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public Task DeleteAsync(IdInput input)
{
return _organizationUnitManager.DeleteAsync(input.Id);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update)]
public async Task UpdateAsync(UpdateOrganizationUnitInput input)
{
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)
{
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)
{
await _organizationUnitManager.RemoveRoleFromOrganizationUnitAsync(input.RoleId, input.OrganizationUnitId);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input)
{
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)
{
await _identityUserManager.RemoveFromOrganizationUnitAsync(input.UserId, input.OrganizationUnitId);
@ -91,7 +100,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{
var listResult = new List<GetOrganizationUnitUserOutput>();
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);
if (count > 0)
@ -113,7 +122,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{
var listResult = new List<GetUnAddUserOutput>();
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);
if (count > 0)
{
@ -134,7 +143,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{
var listResult = new List<GetOrganizationUnitRoleOutput>();
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);
if (count > 0)
@ -150,7 +159,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
{
var listResult = new List<GetUnAddRoleOutput>();
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);
if (count > 0)
{
@ -169,7 +178,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
#region 私有方法
private List<TreeOutput> ConvertToTree(List<OrganizationUnitDto> list,
private List<TreeOutput> ConvertToTree(
List<OrganizationUnitDto> list,
Guid? Id = null)
{
var result = new List<TreeOutput>();
@ -188,7 +198,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp
return result;
}
private List<OrganizationUnitDto> Children(List<OrganizationUnitDto> list,
private List<OrganizationUnitDto> Children(
List<OrganizationUnitDto> list,
Guid? Id)
{
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 IdentityModel;
using Lion.AbpPro.Extension.Customs.Http;
using Lion.AbpPro.NotificationManagement.Notifications;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Volo.Abp;
using Volo.Abp.Authorization;
using Volo.Abp.Identity;
using Volo.Abp.Security.Claims;
@ -28,7 +30,7 @@ namespace Lion.AbpPro.Users
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuretion;
private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository;
public AccountAppService(
IdentityUserManager userManager,
IOptionsSnapshot<JwtOptions> jwtOptions,
@ -51,12 +53,12 @@ namespace Lion.AbpPro.Users
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
if (result.IsNotAllowed)
{
throw new UserFriendlyException("当前用户已锁定");
throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
}
if (!result.Succeeded)
{
throw new UserFriendlyException("用户名或者密码错误");
throw new BusinessException(AbpProDomainErrorCodes.UserOrPasswordMismatch);
}
var user = await _userManager.FindByNameAsync(input.Name);
@ -76,7 +78,7 @@ namespace Lion.AbpPro.Users
var user = await _userManager.FindByNameAsync(response.name);
if (!user.IsActive)
{
throw new UserFriendlyException("当前用户已锁定");
throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
}
return await BuildResult(user);
@ -115,7 +117,7 @@ namespace Lion.AbpPro.Users
{
var result = new LoginOutput();
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 user = new IdentityUser(userId, userName, email)
@ -138,9 +140,9 @@ namespace Lion.AbpPro.Users
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);
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,
user.TenantId.ToString(), roles.ToList());
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 Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.NotificationManagement.Notifications;
using Lion.AbpPro.Permissions;
using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Excel.AspNetCore;
@ -27,13 +28,13 @@ namespace Lion.AbpPro.Users
private readonly IIdentityUserRepository _identityUserRepository;
private readonly IExcelExporter _excelExporter;
private readonly IOptions<IdentityOptions> _options;
public UserAppService(
IIdentityUserAppService identityUserAppService,
IdentityUserManager userManager,
IIdentityUserRepository userRepository,
IExcelExporter excelExporter,
IOptions<IdentityOptions> options)
IOptions<IdentityOptions> options,
NotificationManager notificationManager)
{
_identityUserAppService = identityUserAppService;
_userManager = userManager;

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

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

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

@ -7,22 +7,6 @@
<TargetFramework>net6.0</TargetFramework>
</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>
<PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsLoggingVersion)" />
<PackageReference Include="Serilog.Sinks.Async" Version="$(SerilogSinksAsyncVersion)" />
@ -42,6 +26,9 @@
<Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" />
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</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) =>
Host.CreateDefaultBuilder(args)
.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) =>
{
var s = hostContext.HostingEnvironment;
var _configurationRoot= services.GetRequiredService<IConfigurationRoot>();
var ss = _configurationRoot.GetValue<string>("ConnectionStrings:Default");
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
{
/* 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 =>
{
options.FileSets.AddEmbedded<AbpProDomainSharedModule>("Lion.AbpPro");
options.FileSets.AddEmbedded<AbpProDomainSharedModule>(AbpProDomainSharedConsts.NameSpace);
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpProResource>("zh-Hans")
.Add<AbpProResource>(AbpProDomainSharedConsts.DefaultCultureName)
.AddVirtualJson("/Localization/AbpPro")
.AddBaseTypes(typeof(IdentityResource))
.AddBaseTypes(typeof(AbpValidationResource))
@ -70,7 +70,7 @@ namespace Lion.AbpPro
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:ESManagement": "ESManagement",
"Permission:SettingManagement": "SettingManagement",
"Permission:OrganizationUnitManagement": "OrganizationUnitManagement",
"Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "Client",
"Permission:IdentityServerManagement:ApiResource": "ApiResource",
@ -28,6 +29,19 @@
"Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"Created",
"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:ESManagement": "ES日志",
"Permission:SettingManagement": "设置管理",
"Permission:OrganizationUnitManagement": "组织结构管理",
"Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "客户端",
"Permission:IdentityServerManagement:ApiResource": "Api资源",
@ -28,6 +29,18 @@
"Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created: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;
namespace Lion.AbpPro.Localization
namespace Lion.AbpPro
{
[LocalizationResourceName("AbpPro")]
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.Diagnostics;
using System.IO;
@ -13,207 +13,208 @@ using Volo.Abp.Identity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.TenantManagement;
namespace Lion.AbpPro.Data;
public class AbpProDbMigrationService : ITransientDependency
namespace Lion.AbpPro.Data
{
public ILogger<AbpProDbMigrationService> Logger { get; set; }
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)
public class AbpProDbMigrationService : ITransientDependency
{
_dataSeeder = dataSeeder;
_dbSchemaMigrators = dbSchemaMigrators;
_tenantRepository = tenantRepository;
_currentTenant = currentTenant;
Logger = NullLogger<AbpProDbMigrationService>.Instance;
}
public ILogger<AbpProDbMigrationService> Logger { get; set; }
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;
_dbSchemaMigrators = dbSchemaMigrators;
_tenantRepository = tenantRepository;
_currentTenant = currentTenant;
public async Task MigrateAsync()
{
var initialMigrationAdded = AddInitialMigrationIfNotExist();
Logger = NullLogger<AbpProDbMigrationService>.Instance;
}
if (initialMigrationAdded)
public async Task MigrateAsync()
{
return;
}
var initialMigrationAdded = AddInitialMigrationIfNotExist();
Logger.LogInformation("Started database migrations...");
if (initialMigrationAdded)
{
return;
}
await MigrateDatabaseSchemaAsync();
await SeedDataAsync();
Logger.LogInformation("Started database migrations...");
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>();
foreach (var tenant in tenants)
{
using (_currentTenant.Change(tenant.Id))
var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
var migratedDatabaseSchemas = new HashSet<string>();
foreach (var tenant in tenants)
{
if (tenant.ConnectionStrings.Any())
using (_currentTenant.Change(tenant.Id))
{
var tenantConnectionStrings = tenant.ConnectionStrings
.Select(x => x.Value)
.ToList();
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
if (tenant.ConnectionStrings.Any())
{
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.");
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)
private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null)
{
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)
{
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
private async Task SeedDataAsync(Tenant tenant = null)
{
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
);
}
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
);
}
private bool AddInitialMigrationIfNotExist()
{
try
private bool AddInitialMigrationIfNotExist()
{
if (!DbMigrationsProjectExists())
try
{
if (!DbMigrationsProjectExists())
{
return false;
}
}
catch (Exception)
{
return false;
}
}
catch (Exception)
{
return false;
}
try
{
if (!MigrationsFolderExists())
try
{
AddInitialMigration();
return true;
if (!MigrationsFolderExists())
{
AddInitialMigration();
return true;
}
else
{
return false;
}
}
else
catch (Exception e)
{
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
return false;
}
}
catch (Exception e)
{
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
return false;
}
}
private bool DbMigrationsProjectExists()
{
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath();
private bool DbMigrationsProjectExists()
{
var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath();
return dbMigrationsProjectFolder != null;
}
return dbMigrationsProjectFolder != null;
}
private bool MigrationsFolderExists()
{
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath();
private bool MigrationsFolderExists()
{
var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath();
return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations"));
}
return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "EntityFrameworkCore"));
}
private void AddInitialMigration()
{
Logger.LogInformation("Creating initial migration...");
private void AddInitialMigration()
{
Logger.LogInformation("Creating initial migration...");
string argumentPrefix;
string fileName;
string argumentPrefix;
string fileName;
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
argumentPrefix = "-c";
fileName = "/bin/bash";
}
else
{
argumentPrefix = "/C";
fileName = "cmd.exe";
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
argumentPrefix = "-c";
fileName = "/bin/bash";
}
else
{
argumentPrefix = "/C";
fileName = "cmd.exe";
}
var procStartInfo = new ProcessStartInfo(fileName,
$"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\""
);
var procStartInfo = new ProcessStartInfo(fileName,
$"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetDbMigrationsProjectFolderPath()}\"\""
);
try
{
Process.Start(procStartInfo);
}
catch (Exception)
{
throw new Exception("Couldn't run ABP CLI...");
try
{
Process.Start(procStartInfo);
}
catch (Exception)
{
throw new Exception("Couldn't run ABP CLI...");
}
}
}
private string GetEntityFrameworkCoreProjectFolderPath()
{
var slnDirectoryPath = GetSolutionDirectoryPath();
if (slnDirectoryPath == null)
private string GetDbMigrationsProjectFolderPath()
{
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)
.FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore"));
}
var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src");
private string GetSolutionDirectoryPath()
{
var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());
return Directory.GetDirectories(srcDirectoryPath)
.FirstOrDefault(d => d.EndsWith(".DbMigrations"));
}
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;
public interface IAbpProDbSchemaMigrator
namespace Lion.AbpPro.Data
{
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;
namespace Lion.AbpPro.Data;
/* This is used if database provider does't define
* IAbpProDbSchemaMigrator implementation.
*/
public class NullAbpProDbSchemaMigrator : IAbpProDbSchemaMigrator, ITransientDependency
namespace Lion.AbpPro.Data
{
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,
CancellationToken cancellationToken = default)
{
return _apiResourceRepository.GetListAsync("CreationTime desc", skipCount,
maxResultCount, filter,
return _apiResourceRepository.GetListAsync
(
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails,
cancellationToken);
cancellationToken
);
}
public Task<long> GetCountAsync(string filter = null,
public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default)
{
return _apiResourceRepository.GetCountAsync(filter,
cancellationToken);
return _apiResourceRepository.GetCountAsync
(
filter,
cancellationToken
);
}
/// <summary>
@ -65,10 +74,16 @@ namespace Lion.AbpPro.IdentityServer
await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken);
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,
ShowInDiscoveryDocument = showInDiscoveryDocument,
@ -83,8 +98,11 @@ namespace Lion.AbpPro.IdentityServer
//
// properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); });
return await _apiResourceRepository.InsertAsync(apiResource,
cancellationToken: cancellationToken);
return await _apiResourceRepository.InsertAsync
(
apiResource,
cancellationToken: cancellationToken
);
}
public async Task DeleteAsync(
@ -104,14 +122,13 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument,
string secret,
List<string> scopes,
CancellationToken cancellationToken = default
)
CancellationToken cancellationToken = default)
{
var apiResource =
await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken);
if (null == apiResource)
{
throw new UserFriendlyException(message: "ApiResource不存在");
throw new BusinessException(AbpProDomainErrorCodes.ApiResourceNotExist);
}
apiResource.DisplayName = displayName;
@ -148,8 +165,11 @@ namespace Lion.AbpPro.IdentityServer
}
return await _apiResourceRepository.UpdateAsync(apiResource,
cancellationToken: cancellationToken);
return await _apiResourceRepository.UpdateAsync
(
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,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.GetListAsync(
return _apiScopeRepository.GetListAsync
(
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails,
cancellationToken);
cancellationToken
);
}
public Task<long> GetCountAsync(string filter = null,
public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.GetCountAsync(filter, cancellationToken);
@ -48,11 +51,19 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
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,
required, emphasize,
showInDiscoveryDocument, enabled);
var scope = new ApiScope
(
GuidGenerator.Create(),
name,
displayName,
description,
required,
emphasize,
showInDiscoveryDocument,
enabled
);
return await _apiScopeRepository.InsertAsync(scope);
}
@ -67,7 +78,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
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.Description = description;
apiScope.Enabled = enabled;
@ -77,18 +88,25 @@ namespace Lion.AbpPro.IdentityServer
return await _apiScopeRepository.UpdateAsync(apiScope);
}
public Task DeleteAsync(Guid id, bool autoSave = false,
public Task DeleteAsync(
Guid id,
bool autoSave = false,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken);
}
public async Task<List<ApiScope>> FindAllAsync(
CancellationToken cancellationToken = default)
public async Task<List<ApiScope>> FindAllAsync(CancellationToken cancellationToken = default)
{
return await _apiScopeRepository.GetListAsync("CreationTime desc", 0, Int32.MaxValue,
null, false,
cancellationToken);
return await _apiScopeRepository.GetListAsync
(
"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)
{
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)
{
ClientName = clientName, Description = description,
@ -108,7 +108,7 @@ namespace Lion.AbpPro.IdentityServer
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null)
{
throw new UserFriendlyException(message: $"{clientId}不存在");
throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
}
client.ClientName = clientName;
@ -180,7 +180,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes)
{
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.RemoveAllScopes();
foreach (var item in scopes.Distinct())
@ -201,7 +201,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
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()))
{
return client;
@ -220,7 +220,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
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()))
{
client.RemoveRedirectUri(uri);
@ -239,7 +239,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
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))
{
return client;
@ -256,7 +256,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
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))
{
client.RemovePostLogoutRedirectUri(uri);
@ -273,7 +273,7 @@ namespace Lion.AbpPro.IdentityServer
{
origin = origin.Trim();
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))
{
return client;
@ -292,7 +292,7 @@ namespace Lion.AbpPro.IdentityServer
{
origin = origin.Trim();
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))
{
client.RemoveCorsOrigin(origin);
@ -305,7 +305,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> EnabledAsync(string clientId, bool enabled)
{
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;
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)
{
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,
description, enabled,
required,
@ -74,7 +74,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
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.Description = description;
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.
* See also AbpProMigrationsDbContextFactory for EF Core tooling. */
options.UseMySQL();
options.PreConfigure<AbpProDbContext>(options =>
{
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()
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var appSettingFileName = "appsettings.json";
if (!environment.IsNullOrWhiteSpace())
appSettingFileName = $"appsettings.{environment}.json";
var builder = new ConfigurationBuilder()
.SetBasePath
(
@ -41,7 +35,7 @@ namespace Lion.AbpPro.EntityFrameworkCore
)
.AddJsonFile
(
appSettingFileName,
"appsettings.json",
false
);

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

@ -12,8 +12,7 @@ namespace Lion.AbpPro.EntityFrameworkCore
{
private readonly IServiceProvider _serviceProvider;
public EntityFrameworkCoreAbpProDbSchemaMigrator(
IServiceProvider serviceProvider)
public EntityFrameworkCoreAbpProDbSchemaMigrator(IServiceProvider 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]
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(),
"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]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result = await _idenityServerApiScopeManager.CreateAsync(
"ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true);
})).Message.ShouldBe("ApiScope_Test已存在");
})).Code.ShouldBe(AbpProDomainErrorCodes.ApiScopeExist);
}
// [Fact]

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

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

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

@ -63,13 +63,13 @@ namespace Lion.AbpPro.IdentityServer
[Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result = await _identityResourceManager.CreateAsync("openid", "单元测试",
"desc", true, 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',
},
},
{
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',
name: 'Settings',
@ -83,16 +93,6 @@ const admin: AppRouteModule = {
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;
const guard: boolean = this.urlGuard(options.url as string);
const userStore = useUserStoreWithOut();
const { token, language } = this.buildRequestMessage();
if (!guard) {
if (userStore.checkUserLoginExpire) {
router.replace(PageEnum.BASE_LOGIN);
return;
}
const { token, language } = this.buildRequestMessage();
// 添加header
options.headers = {
'accept-language': language,
@ -29,6 +28,7 @@ export class ServiceProxyBase {
options.headers = {
'Content-Type': 'application/json',
__tenant: userStore.tenantId,
'accept-language': language,
};
}

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

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

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

@ -3,9 +3,9 @@
<BasicTable @register="registerTable" size="small">
<template #url="{ record }">
<Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">{{
record.httpMethod
}}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">
{{ record.httpMethod }}
</Tag>
<span style="margin-left: 5px">{{ record.url }}</span>
</template>
</BasicTable>
@ -13,46 +13,47 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicTable, useTable } from '/@/components/Table';
import { tableColumns, searchFormSchema, getTableListAsync,httpStatusCodeColor,httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from 'ant-design-vue';
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 },
});
import { defineComponent } from "vue";
import { BasicTable, useTable } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync, httpStatusCodeColor, httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from "ant-design-vue";
import { useI18n } from "/@/hooks/web/useI18n";
return {
registerTable,
reload,
t,
httpStatusCodeColor,
httpMethodColor,
};
},
});
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 {
registerTable,
reload,
t,
httpStatusCodeColor,
httpMethodColor
};
}
});
</script>

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

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

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

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

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

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

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

@ -14,56 +14,57 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'CreateAbpDictionaryType',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
import { defineComponent } from "vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner();
const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({
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);
}
};
export default defineComponent({
name: "CreateAbpDictionaryType",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const cancel = () => {
resetFields();
closeModal();
};
const [registerModal, { closeModal, changeOkLoading }] = useModalInner();
const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({
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 {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel,
};
},
});
const cancel = () => {
resetFields();
closeModal();
};
return {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

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

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

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

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

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

@ -1,50 +1,52 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import { useI18n } from '/@/hooks/web/useI18n';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
import moment from 'moment';
import moment from "moment";
import {
EsLogServiceProxy,
PagingElasticSearchLogInput,
PagingElasticSearchLogOutputCustomePagedResultDto,
} from '/@/services/ServiceProxies';
PagingElasticSearchLogOutputCustomePagedResultDto
} from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
component: 'Input',
label: t('common.key'),
field: "filter",
component: "Input",
label: t("common.key"),
labelWidth: 80,
colProps: {
span: 6,
},
span: 6
}
},
{
field: 'time',
component: 'RangePicker',
label: '创建时间:',
field: "time",
component: "RangePicker",
label: "创建时间:",
labelWidth: 80,
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[] = [
{
title: t('routes.admin.logLevel'),
dataIndex: 'level',
width: 200,
title: t("routes.admin.logLevel"),
dataIndex: "level",
width: 200
},
{
title: t('common.creationTime'),
dataIndex: 'creationTime',
title: t("common.creationTime"),
dataIndex: "creationTime",
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'),
dataIndex: 'message',
},
title: t("routes.admin.logContent"),
dataIndex: "message"
}
];
/**

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

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

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

@ -1,31 +1,32 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import moment from 'moment';
import { FilesServiceProxy, PagingFileInput } from '/@/services/ServiceProxies';
import { useI18n } from '/@/hooks/web/useI18n';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import moment from "moment";
import { FilesServiceProxy, PagingFileInput } from "/@/services/ServiceProxies";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
label: t('routes.admin.fileName'),
component: 'Input',
colProps: { span: 8 },
},
field: "filter",
label: t("routes.admin.fileName"),
component: "Input",
colProps: { span: 8 }
}
];
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.fileName'),
dataIndex: 'fileName',
title: t("routes.admin.fileName"),
dataIndex: "fileName"
},
{
title: t('routes.admin.userManagement_createTime'),
dataIndex: 'creationTime',
title: t("routes.admin.userManagement_createTime"),
dataIndex: "creationTime",
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>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { UploadOutlined } from '@ant-design/icons-vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File";
import { Tag } from 'ant-design-vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { getOSSClient, importFileAsync, downLoadFile } from './UploadOss';
import { CreateFileInput } from '/@/services/ServiceProxies';
import moment from 'moment';
export default defineComponent({
components: {
BasicTable,
TableAction,
Tag,
UploadOutlined,
},
setup() {
const { t } = useI18n();
const fileList = ref([]);
// 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,
actionColumn: {
width: 120,
title: t('common.action'),
dataIndex: 'action',
slots: {
customRender: 'action',
},
fixed: 'right',
import { defineComponent, ref } from "vue";
import { UploadOutlined } from "@ant-design/icons-vue";
import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File";
import { Tag } from "ant-design-vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { getOSSClient, importFileAsync, downLoadFile } from "./UploadOss";
import { CreateFileInput } from "/@/services/ServiceProxies";
import moment from "moment";
export default defineComponent({
components: {
BasicTable,
TableAction,
Tag,
UploadOutlined
},
setup() {
const { t } = useI18n();
const fileList = ref([]);
// 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,
actionColumn: {
width: 120,
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
});
fixed: "right"
}
});
async function customRequest(action) {
let fileName = action.file.name;
let index = fileName.lastIndexOf('.');
let type = fileName.slice(index + 1);
let name = fileName.slice(0, index);
const client = await getOSSClient();
let fileFullName = `host/${moment().format('YYYY-MM-DD')}/${name}_${moment().format(
'X'
)}.${type}`;
async function customRequest(action) {
let fileName = action.file.name;
let index = fileName.lastIndexOf(".");
let type = fileName.slice(index + 1);
let name = fileName.slice(0, index);
const client = await getOSSClient();
let fileFullName = `host/${moment().format("YYYY-MM-DD")}/${name}_${moment().format(
"X"
)}.${type}`;
await client.put(fileFullName, action.file);
let request = new CreateFileInput();
request.fileName = fileName;
request.filePath = fileFullName;
await importFileAsync({ request });
await reload();
}
const handleDownload = async (record: Recordable) => {
await downLoadFile(record.filePath);
};
return {
t,
fileList,
registerTable,
customRequest,
handleDownload,
};
},
});
await client.put(fileFullName, action.file);
let request = new CreateFileInput();
request.fileName = fileName;
request.filePath = fileFullName;
await importFileAsync({ request });
await reload();
}
const handleDownload = async (record: Recordable) => {
await downLoadFile(record.filePath);
};
return {
t,
fileList,
registerTable,
customRequest,
handleDownload
};
}
});
</script>
<style lang="less" scoped></style>

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

@ -1,6 +1,6 @@
import { FilesServiceProxy, FileTokenOutput } from '/@/services/ServiceProxies';
import OSS from 'ali-oss';
import moment from 'moment';
import { FilesServiceProxy, FileTokenOutput } from "/@/services/ServiceProxies";
import OSS from "ali-oss";
import moment from "moment";
export async function importFileAsync({ request }) {
const _filesServiceProxy = new FilesServiceProxy();
@ -10,20 +10,20 @@ export async function importFileAsync({ request }) {
async function getFileTokenAsync() {
const _filesServiceProxy = new FilesServiceProxy();
const result = await _filesServiceProxy.getFileToken();
sessionStorage.setItem('oss', JSON.stringify(result));
sessionStorage.setItem("oss", JSON.stringify(result));
return result;
}
export async function getOSSClient(): Promise<OSS> {
let fileToken = new FileTokenOutput();
try {
let oss = sessionStorage.getItem('oss');
let oss = sessionStorage.getItem("oss");
if (!oss) {
fileToken = await getFileTokenAsync();
} else {
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;
if (expiration < formatDate(moment.now())) {
fileToken = await getFileTokenAsync();
@ -34,36 +34,36 @@ export async function getOSSClient(): Promise<OSS> {
accessKeyId: fileToken.accessKeyId,
accessKeySecret: fileToken.accessKeySecret,
bucket: fileToken.bucket,
stsToken: fileToken.token as string,
stsToken: fileToken.token as string
};
return Promise.resolve<OSS>(new OSS(request));
} catch (error) {
console.error('获取oss Client失败');
console.error("获取oss Client失败");
}
}
export async function downLoadFile(fileName) {
let oss = await getOSSClient();
const response = {
'content-disposition': `attachment; filename=${encodeURIComponent(fileName)}`,
"content-disposition": `attachment; filename=${encodeURIComponent(fileName)}`
};
const url = (oss as OSS).signatureUrl(fileName, { response });
let link = document.createElement('a'); //创建a标签
link.style.display = 'none'; //使其隐藏
let link = document.createElement("a"); //创建a标签
link.style.display = "none"; //使其隐藏
link.href = url; //赋予文件下载地址
link.setAttribute('download', fileName); //设置下载属性 以及文件名
link.setAttribute("download", fileName); //设置下载属性 以及文件名
document.body.appendChild(link); //a标签插至页面中
link.click(); //强制触发a标签事件
}
function formatDate(dateTime) {
const date = new Date(dateTime);
const YY = date.getFullYear() + '-';
const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
const hh = date.getHours() + ':';
const mm = date.getMinutes() + ':';
const YY = date.getFullYear() + "-";
const MM = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";
const DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
const hh = date.getHours() + ":";
const mm = date.getMinutes() + ":";
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"
@cancel="cancel"
@register="registerModal"
:minHeight="100"
:destroyOnClose="true"
>
<BasicTable @register="registerRoleTable" size="small"/>
<BasicTable @register="registerRoleTable" @selection-change="onSelectChange" size="small" />
</BasicModal>
</div>
</template>
@ -21,45 +20,63 @@ import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema
getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema, addRoleToOrganizationUnitAsync, GetUnAddUserAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import { AddRoleToOrganizationUnitInput } from "/@/services/ServiceProxies";
import { useTable } from "/@/components/Table";
import { AddRoleToOrganizationUnitInput, GetUnAddRoleInput } from "/@/services/ServiceProxies";
import { BasicTable, useTable } from "/@/components/Table";
export default defineComponent({
name: "AddRoleToOrganizationUnit",
components: {
BasicModal,
BasicForm
BasicForm,
BasicTable
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
getForm().setFieldsValue({
organizationUnitId: data.organizationUnitId
});
});
const [registerRoleTable, { getForm,getSelectRowKeys }] = useTable({
const getTableAsync = async () => {
let request= new GetUnAddRoleInput();
request.organizationUnitId=organizationUnitId;
return await getUnAddRolesAsync(request)
};
const [registerRoleTable, { reload }] = useTable({
columns: addRoleTableColumns,
formConfig: {
labelWidth: 70,
schemas: searchAddRoleFormSchema
},
api: getUnAddRolesAsync,
showTableSetting: true,
api: getTableAsync,
showTableSetting: false,
useSearchForm: false,
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 () => {
try {
let selectedRoles = getSelectRowKeys();
console.log(selectedRoles);
changeOkLoading(true)
let request = new AddRoleToOrganizationUnitInput();
request.organizationUnitId = getForm().getFieldsValue().organizationUnitId;
request.organizationUnitId = organizationUnitId;
request.roleId=selectRoles;
await addRoleToOrganizationUnitAsync(request);
changeOkLoading(false);
closeModal();
emit("reload");
} catch (error) {
changeOkLoading(false);
@ -67,6 +84,8 @@ export default defineComponent({
};
const cancel = () => {
organizationUnitId='';
selectRoles=[]
closeModal();
};
@ -75,7 +94,8 @@ export default defineComponent({
registerRoleTable,
submit,
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>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { useI18n } from '/@/hooks/web/useI18n';
import {
createOrganizationUnitFormSchema,
createOrganizationUnitAsync,
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
createOrganizationUnitFormSchema,
createOrganizationUnitAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
export default defineComponent({
name: 'CreateOrganizationUnit',
components: {
BasicModal,
BasicForm,
},
export default defineComponent({
name: "CreateOrganizationUnit",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
if (data.record.parentId == '') {
updateSchema({ field: 'parentDisplayName', ifShow: false });
} else {
updateSchema({ field: 'parentDisplayName', ifShow: true });
setFieldsValue({
parentDisplayName: data.record.parentDisplayName,
parentId: data.record.parentId,
});
}
});
const [
registerOrganizationUnitForm,
{ resetFields, getFieldsValue, validate, setFieldsValue, updateSchema },
] = useForm({
labelWidth: 120,
schemas: createOrganizationUnitFormSchema,
showActionButtonGroup: false,
});
const submit = async () => {
try {
let request = getFieldsValue();
await createOrganizationUnitAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal,
});
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
if (data.record.parentId == "") {
updateSchema({ field: "parentDisplayName", ifShow: false });
} else {
updateSchema({ field: "parentDisplayName", ifShow: true });
setFieldsValue({
parentDisplayName: data.record.parentDisplayName,
parentId: data.record.parentId
});
}
});
const [
registerOrganizationUnitForm,
{ resetFields, getFieldsValue, validate, setFieldsValue, updateSchema }
] = useForm({
labelWidth: 120,
schemas: createOrganizationUnitFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await createOrganizationUnitAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
// emit('clearSelectedRowKeys');
closeModal();
};
const cancel = () => {
resetFields();
// emit('clearSelectedRowKeys');
closeModal();
};
return {
registerModal,
registerOrganizationUnitForm,
submit,
t,
cancel,
};
},
});
return {
registerModal,
registerOrganizationUnitForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

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

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

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

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

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

@ -1,6 +1,6 @@
<template>
<div>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<PageWrapper dense contentFullHeight contentClass="flex">
<div class="bg-white m-4 mr-0 overflow-hidden">
<BasicTree
toolbar
@ -10,14 +10,15 @@
@select="handleSelect"
>
<template #headerTitle>
<span style="font-weight: 500">组织机构</span>
<span style="font-weight: 500"> {{ t("routes.admin.organizationUnit") }}</span>
<a-button
type="primary"
style="margin-left: 20px"
size="small"
v-auth="'System.OrganizationUnitManagement.Create'"
@click="createRootOrganizationUnit"
>
添加根机构
{{ t("routes.admin.createRootOrganizationUnit") }}
</a-button>
</template>
</BasicTree>
@ -25,15 +26,26 @@
<div class="bg-white m-4 mr-0 w-3/4 xl:w-4/5">
<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">
<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 }">
<TableAction
:actions="[
{
icon: 'ant-design:delete-outlined',
label: '删除',
onClick: handleUserDelete.bind(null, record),
icon: 'ant-design:delete-outlined',
label: t('common.delText'),
auth:'System.OrganizationUnitManagement.Delete',
onClick: handleUserDelete.bind(null, record),
},
]"
/>
@ -41,13 +53,14 @@
</BasicTable>
</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">
<template #toolbar>
<a-button
preIcon="ant-design:plus-circle-outlined"
type="primary"
@click="AddRoleToOrganizationUnitModal"
v-auth="'System.OrganizationUnitManagement.Update'"
@click="openAddRoleToOrganizationUnitModal"
>
{{ t("common.createText") }}
</a-button>
@ -56,13 +69,13 @@
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'ant-design:delete-outlined',
label: '删除',
onClick: handleRoleDelete.bind(null, record),
},
]"
{
icon: 'ant-design:delete-outlined',
label: t('common.delText'),
auth:'System.OrganizationUnitManagement.Delete',
onClick: handleRoleDelete.bind(null, record),
},
]"
/>
</template>
</BasicTable>
@ -75,7 +88,10 @@
@reload="initOrganizationUnit"
/>
<EditOrganizationUnit @register="registerEditOrganizationUnit" @reload="initOrganizationUnit" />
<AddRoleToOrganizationUnit @register="registerAddRoleToOrganizationUnit" @reload="initOrganizationUnit" />
<AddRoleToOrganizationUnit @register="registerAddRoleToOrganizationUnit"
@reload="reloadRole" />
<AddUserToOrganizationUnit @register="registerAddUserToOrganizationUnit"
@reload="reloadUser" />
</div>
</template>
@ -103,7 +119,8 @@ import {
import { Tabs } from "ant-design-vue";
import CreateOrganizationUnit from "./CreateOrganizationUnit.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 { useMessage } from "/@/hooks/web/useMessage";
@ -121,18 +138,32 @@ export default defineComponent({
EditOrganizationUnit,
BasicTable,
TableAction,
AddRoleToOrganizationUnit
AddRoleToOrganizationUnit,
AddUserToOrganizationUnit
},
setup() {
const { t } = useI18n();
const { createConfirm } = useMessage();
const treeData = ref<TreeOutput[]>([]);
const activeKey = ref("1");
const [registerCreateOrganizationUnit, { openModal: CreateOrganizationUnitModal }] =
useModal();
const [registerCreateOrganizationUnit, { openModal: CreateOrganizationUnitModal }] =useModal();
const [registerEditOrganizationUnit, { openModal: EditOrganizationUnitModal }] = useModal();
const [registerAddRoleToOrganizationUnit, { openModal: AddRoleToOrganizationUnitModal }] =
useModal();
const [registerAddRoleToOrganizationUnit, { openModal: AddRoleToOrganizationUnitModal }] = 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 () => {
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) {
console.log(keys);
if (keys.length > 0) {
organizationUnitId = keys[0];
if (activeKey.value == "1") {
@ -251,7 +279,6 @@ export default defineComponent({
}
});
const [registerRoleTable, { reload: reloadRole }] = useTable({
columns: roleTableColumns,
api: getRoleAsync,
@ -283,7 +310,6 @@ export default defineComponent({
};
//
const handleUserDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
@ -300,7 +326,6 @@ export default defineComponent({
});
};
//
const handleRoleDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
@ -332,7 +357,13 @@ export default defineComponent({
handleRoleDelete,
t,
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 { BasicColumn } from '/@/components/Table';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import {
RolesServiceProxy,
PagingRoleListInput,
@ -7,98 +7,99 @@ import {
IdentityRoleCreateDto,
PermissionsServiceProxy,
IdInput,
GetPermissionInput,
} from '/@/services/ServiceProxies';
import { message } from 'ant-design-vue';
import { useLoading } from '/@/components/Loading';
GetPermissionInput
} from "/@/services/ServiceProxies";
import { message } from "ant-design-vue";
import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...',
tip: "Loading..."
});
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.userManagement_roleName'),
dataIndex: 'name',
title: t("routes.admin.userManagement_roleName"),
dataIndex: "name"
},
{
title: t('routes.admin.roleManagement_default'),
dataIndex: 'isDefault',
slots: { customRender: 'category' },
},
title: t("routes.admin.roleManagement_default"),
dataIndex: "isDefault",
slots: { customRender: "category" }
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
colProps: { span: 8 },
},
field: "filter",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
colProps: { span: 8 }
}
];
export const createFormSchema: FormSchema[] = [
{
field: 'name',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
field: "name",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
required: true,
colProps: { span: 18 },
colProps: { span: 18 }
},
{
field: 'isDefault',
component: 'RadioGroup',
label: t('routes.admin.roleManagement_default'),
field: "isDefault",
component: "RadioGroup",
label: t("routes.admin.roleManagement_default"),
required: true,
colProps: {
span: 18,
span: 18
},
defaultValue: '0',
defaultValue: "0",
componentProps: {
options: [
{
label: t('common.true'),
value: '1',
label: t("common.true"),
value: "1"
},
{
label: t('common.false'),
value: '0',
},
],
},
},
label: t("common.false"),
value: "0"
}
]
}
}
];
export const editFormSchema: FormSchema[] = [
{
field: 'name',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
field: "name",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
required: true,
colProps: { span: 18 },
colProps: { span: 18 }
},
{
field: 'isDefault',
component: 'RadioGroup',
label: t('routes.admin.roleManagement_default'),
field: "isDefault",
component: "RadioGroup",
label: t("routes.admin.roleManagement_default"),
required: true,
colProps: {
span: 18,
span: 18
},
componentProps: {
options: [
{
label: t('common.true'),
value: '1',
label: t("common.true"),
value: "1"
},
{
label: t('common.false'),
value: '0',
},
],
},
},
label: t("common.false"),
value: "0"
}
]
}
}
];
/**
@ -123,7 +124,7 @@ export async function deleteRoleAsync({ roleId, reload }) {
request.id = roleId;
await _roleServiceProxy.delete(request);
closeFullLoading();
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
reload();
} catch (error) {
closeFullLoading();
@ -139,11 +140,11 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
await validate();
let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto();
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();
await _roleServiceProxy.create(requestBody);
changeOkLoading(false);
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
closeModal();
}
@ -155,7 +156,7 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
export async function getRolePermissionAsync(roleName: string) {
const _permissionsServiceProxy = new PermissionsServiceProxy();
const request = new GetPermissionInput();
request.providerName = 'R';
request.providerName = "R";
request.providerKey = roleName;
return await _permissionsServiceProxy.tree(request);
}

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save