Browse Source

集成Magicodes.IE 实现导出用户列表示例

main-auditlogging
王军 5 years ago
parent
commit
833b940d7a
  1. 1
      aspnet-core/Directory.Build.props
  2. 17
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs
  3. 1
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Lion.AbpPro.Application.Contracts.csproj
  4. 1
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs
  5. 1
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs
  6. 26
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Users/Dtos/ExportIdentityUserOutput.cs
  7. 7
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Users/IUserAppService.cs
  8. 5
      aspnet-core/services/src/Lion.AbpPro.Application/AbpProApplicationAutoMapperProfile.cs
  9. 39
      aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs
  10. 1
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Lion.AbpPro.Domain.Shared.csproj
  11. 1
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json
  12. 1
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json
  13. 12
      aspnet-core/services/src/Lion.AbpPro.HttpApi/Controllers/Systems/UserController.cs
  14. 2
      vben271/nswag/nswag.json
  15. 1
      vben271/src/locales/lang/en/common.ts
  16. 1
      vben271/src/locales/lang/zh-CN/common.ts
  17. 587
      vben271/src/services/ServiceProxies.ts
  18. 19
      vben271/src/views/admin/users/AbpUser.ts
  19. 17
      vben271/src/views/admin/users/AbpUser.vue

1
aspnet-core/Directory.Build.props

@ -28,6 +28,7 @@
<XunitVersion>2.4.1</XunitVersion>
<XunitrunnervisualstudioVersion>2.4.3</XunitrunnervisualstudioVersion>
<OcelotVersion>17.0.0</OcelotVersion>
<MagicodesIEExcelVersion>2.6.1</MagicodesIEExcelVersion>
</PropertyGroup>
</Project>

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

@ -44,6 +44,9 @@ using Volo.Abp.Caching;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Modularity;
using Volo.Abp.Swashbuckle;
using Microsoft.AspNetCore.Mvc;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Excel;
namespace Lion.AbpPro
{
@ -81,6 +84,7 @@ namespace Lion.AbpPro
ConfigurationCap(context);
ConfigurationStsHttpClient(context);
ConfigurationMiniProfiler(context);
ConfigureMagicodes(context);
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
@ -126,6 +130,16 @@ namespace Lion.AbpPro
}
}
/// <summary>
/// 配置Magicodes.IE
/// Excel导入导出
/// </summary>
/// <param name="context"></param>
private void ConfigureMagicodes(ServiceConfigurationContext context)
{
context.Services.AddTransient<IExporter, ExcelExporter>();
context.Services.AddTransient<IExcelExporter, ExcelExporter>();
}
private void ConfigureHangfireMysql(ServiceConfigurationContext context)
{
@ -288,6 +302,9 @@ namespace Lion.AbpPro
context.Services.AddSwaggerGen(
options =>
{
// 文件下载类型
options.MapType<FileContentResult>(() => new OpenApiSchema() { Type = "file" });
options.SwaggerDoc("AbpPro",
new OpenApiInfo { Title = "LionAbpPro API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);

1
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Lion.AbpPro.Application.Contracts.csproj

@ -22,6 +22,7 @@
<PackageReference Include="Volo.Abp.TenantManagement.Application.Contracts" Version="$(AbpPackageVersion)" />
<PackageReference Include="Volo.Abp.FeatureManagement.Application.Contracts" Version="$(AbpPackageVersion)" />
<PackageReference Include="Volo.Abp.SettingManagement.Application.Contracts" Version="$(AbpPackageVersion)" />
<PackageReference Include="Magicodes.IE.Excel.AspNetCore" Version="$(MagicodesIEExcelVersion)" />
</ItemGroup>
<ItemGroup>

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

@ -13,6 +13,7 @@ namespace Lion.AbpPro.Permissions
var abpIdentityGroup = context.GetGroup(IdentityPermissions.GroupName);
var userManagement = abpIdentityGroup.GetPermissionOrNull(IdentityPermissions.Users.Default);
userManagement.AddChild(AbpProPermissions.SystemManagement.UserEnable, L("Permission:Enable"));
userManagement.AddChild(AbpProPermissions.SystemManagement.UserExport, L("Permission:Export"));
var auditManagement =
abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement"));

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

@ -11,6 +11,7 @@ namespace Lion.AbpPro.Permissions
{
public const string Default = "System";
public const string UserEnable = Default + ".Users.Enable";
public const string UserExport = Default + ".Users.Export";
public const string AuditLog = Default + ".AuditLog";
public const string ES = Default + ".ES";
public const string Setting = Default + ".Setting";

26
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Users/Dtos/ExportIdentityUserOutput.cs

@ -0,0 +1,26 @@
using System;
using Magicodes.ExporterAndImporter.Core;
namespace Lion.AbpPro.Users.Dtos
{
public class ExportIdentityUserOutput
{
[ExporterHeader(DisplayName = "用户名")] public string UserName { get; set; }
[ExporterHeader(DisplayName = "真实名称")] public string Name { get; set; }
[ExporterHeader(DisplayName = "邮箱")] public string Email { get; set; }
[ExporterHeader(DisplayName = "手机号码")] public string PhoneNumber { get; set; }
[ExporterHeader(IsIgnore = true)] public bool IsActive { get; set; }
[ExporterHeader(DisplayName = "状态")] public string Status => IsActive ? "启用" : "禁用";
[ExporterHeader(IsIgnore = true)] public DateTime CreationTime { get; set; }
[ExporterHeader(DisplayName = "创建时间")]
public string CreationTimeFormat => CreationTime.ToString("yyyy-MM-dd hh:mm:ss");
}
}

7
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Users/IUserAppService.cs

@ -2,6 +2,7 @@ using System;
using System.Threading.Tasks;
using Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Account;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -18,6 +19,12 @@ namespace Lion.AbpPro.Users
/// <returns></returns>
Task<PagedResultDto<IdentityUserDto>> ListAsync(PagingUserListInput input);
/// <summary>
/// 用户导出列表
/// </summary>
/// <returns></returns>
Task<ActionResult> ExportAsync(PagingUserListInput input);
/// <summary>
/// 新增用户
/// </summary>

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

@ -1,4 +1,6 @@
using AutoMapper;
using Lion.AbpPro.Users.Dtos;
using Volo.Abp.Identity;
namespace Lion.AbpPro
{
@ -9,6 +11,9 @@ namespace Lion.AbpPro
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<IdentityUser, ExportIdentityUserOutput>()
.ForMember(e => e.CreationTimeFormat, opt => opt.Ignore())
.ForMember(e => e.Status, opt => opt.Ignore());
}
}
}

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

@ -5,8 +5,11 @@ using System.Threading.Tasks;
using Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Permissions;
using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Excel.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Account;
using Volo.Abp.Application.Dtos;
@ -21,16 +24,17 @@ namespace Lion.AbpPro.Users
private readonly IIdentityUserAppService _identityUserAppService;
private readonly IdentityUserManager _userManager;
private readonly IIdentityUserRepository _identityUserRepository;
private readonly IExcelExporter _excelExporter;
public UserAppService(
IIdentityUserAppService identityUserAppService,
IdentityUserManager userManager,
IIdentityUserRepository userRepository
)
IIdentityUserRepository userRepository,
IExcelExporter excelExporter)
{
_identityUserAppService = identityUserAppService;
_userManager = userManager;
_identityUserRepository = userRepository;
_excelExporter = excelExporter;
}
/// <summary>
@ -47,17 +51,36 @@ namespace Lion.AbpPro.Users
SkipCount = input.SkipCount,
Sorting = " LastModificationTime desc"
};
long count = await _identityUserRepository.GetCountAsync(request.Filter)
.ConfigureAwait(continueOnCapturedContext: false);
long count = await _identityUserRepository.GetCountAsync(request.Filter);
List<Volo.Abp.Identity.IdentityUser> source = await _identityUserRepository
.GetListAsync(request.Sorting, request.MaxResultCount, request.SkipCount, request.Filter)
.ConfigureAwait(continueOnCapturedContext: false);
.GetListAsync(request.Sorting, request.MaxResultCount, request.SkipCount, request.Filter);
return new PagedResultDto<IdentityUserDto>(count,
base.ObjectMapper.Map<List<Volo.Abp.Identity.IdentityUser>, List<IdentityUserDto>>(source));
}
/// <summary>
/// 用户导出列表
/// </summary>
/// <returns></returns>
[Authorize(AbpProPermissions.SystemManagement.UserExport)]
public async Task<ActionResult> ExportAsync(PagingUserListInput input)
{
var request = new GetIdentityUsersInput
{
Filter = input.Filter?.Trim(),
MaxResultCount = input.PageSize,
SkipCount = input.SkipCount,
Sorting = " LastModificationTime desc"
};
List<Volo.Abp.Identity.IdentityUser> source = await _identityUserRepository
.GetListAsync(request.Sorting, request.MaxResultCount, request.SkipCount, request.Filter);
var result = ObjectMapper.Map<List<Volo.Abp.Identity.IdentityUser>, List<ExportIdentityUserOutput>>(source);
var bytes = await _excelExporter.ExportAsByteArray<ExportIdentityUserOutput>(result);
return new XlsxFileResult(bytes: bytes, fileDownloadName: $"用户导出列表{DateTime.Now:yyyyMMdd}");
}
/// <summary>
/// 新增用户
/// </summary>

1
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Lion.AbpPro.Domain.Shared.csproj

@ -19,6 +19,7 @@
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Shared" Version="$(AbpPackageVersion)" />
<PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" Version="$(AbpPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="$(MicrosoftVersion)" />
<PackageReference Include="Magicodes.IE.Excel" Version="$(MagicodesIEExcelVersion)" />
</ItemGroup>
<ItemGroup>

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

@ -9,6 +9,7 @@
"Permission:Create": "Create",
"Permission:Update": "Update",
"Permission:Delete": "Delete",
"Permission:Export": "Export",
"Permission:Enable": "Enable|Disable",
"Permission:SystemManagement": "SystemManagement",
"Permission:AuditLogManagement": "AuditLog",

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

@ -9,6 +9,7 @@
"Permission:Create": "创建",
"Permission:Update": "编辑",
"Permission:Delete": "删除",
"Permission:Export": "导出",
"Permission:Enable": "启用|禁用",
"Permission:AuditLogManagement": "审计日志",
"Permission:SystemManagement": "系统管理",

12
aspnet-core/services/src/Lion.AbpPro.HttpApi/Controllers/Systems/UserController.cs

@ -1,3 +1,4 @@
using System.Net;
using System.Threading.Tasks;
using Lion.AbpPro.Users;
using Lion.AbpPro.Users.Dtos;
@ -11,11 +12,11 @@ using Volo.Abp.Identity;
namespace Lion.AbpPro.Controllers.Systems
{
[Route("Users")]
public class UserContoller : AbpProController, IUserAppService
public class UserController : AbpProController, IUserAppService
{
private readonly IUserAppService _userAppService;
public UserContoller(IUserAppService userAppService)
public UserController(IUserAppService userAppService)
{
_userAppService = userAppService;
}
@ -26,6 +27,13 @@ namespace Lion.AbpPro.Controllers.Systems
{
return _userAppService.ListAsync(input);
}
[HttpPost("export")]
[SwaggerOperation(summary: "导出用户列表", Tags = new[] { "Users" })]
[ProducesResponseType(typeof(FileContentResult), (int)HttpStatusCode.OK)]
public Task<ActionResult> ExportAsync(PagingUserListInput input)
{
return _userAppService.ExportAsync(input);
}
[HttpPost("create")]
[SwaggerOperation(summary: "创建用户", Tags = new[] { "Users" })]

2
vben271/nswag/nswag.json

@ -1,5 +1,5 @@
{
"runtime": "Net50",
"runtime": "Net60",
"defaultVariables": null,
"documentGenerator": {
"fromDocument": {

1
vben271/src/locales/lang/en/common.ts

@ -33,4 +33,5 @@ export default {
status: 'Status',
active: 'IsActive',
download: 'DownLoad',
export:"Export"
};

1
vben271/src/locales/lang/zh-CN/common.ts

@ -36,4 +36,5 @@ export default {
status: '状态',
active: '是否激活',
download: '下载',
export:"导出"
};

587
vben271/src/services/ServiceProxies.ts

File diff suppressed because it is too large

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

@ -214,6 +214,23 @@ export async function getTableListAsync(
return _userServiceProxy.page(params);
}
/**
*
* @param params
* @returns
*/
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();
});
}
/**
*
* @param userId
@ -310,3 +327,5 @@ export async function lockUserAsync(request: LockUserInput): Promise<void> {
const _userServiceProxy = new UsersServiceProxy();
return _userServiceProxy.lock(request);
}

17
vben271/src/views/admin/users/AbpUser.vue

@ -10,6 +10,14 @@
>
{{ t('common.createText') }}
</a-button>
<a-button
preIcon="ant-design:cloud-download-outlined"
type="primary"
@click="handleExport"
v-auth="'System.Users.Export'"
>
{{ t('common.export') }}
</a-button>
</template>
<template #isActive="{ record }">
<Tag :color="record.isActive ? 'green' : 'red'">
@ -69,6 +77,7 @@
getTableListAsync,
deleteUserAsync,
lockUserAsync,
exportAsync
} from './AbpUser';
import { useModal } from '/@/components/Modal';
import CreateAbpUser from './CreateAbpUser.vue';
@ -94,7 +103,7 @@
const [registerEditAbpUserModal, { openModal: openEditAbpUserModal }] = useModal();
// table
const [registerTable, { reload }] = useTable({
const [registerTable, { reload,getForm }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
@ -150,6 +159,11 @@
message.success(t('common.operationSuccess'));
reload();
};
const handleExport=()=>{
const { getFieldsValue } = getForm();
let request = getFieldsValue()
exportAsync({request})
}
return {
registerTable,
handleEdit,
@ -161,6 +175,7 @@
t,
reload,
handleLock,
handleExport
};
},
});

Loading…
Cancel
Save