Browse Source

Merge pull request #4 from colinin/2.9

更新abp到2.9
pull/21/head
cKey 6 years ago
committed by GitHub
parent
commit
b306492482
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      aspnet-core/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN.Abp.MessageService.HttpApi.Host.csproj
  2. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN.Abp.Account.Application.Contracts.csproj
  3. 24
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN/Abp/Account/Dto/PasswordResetDto.cs
  4. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN/Abp/Account/IAccountAppService.cs
  5. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN.Abp.Account.Application.csproj
  6. 119
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/AccountAppService.cs
  7. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN.Abp.Account.Domain.Shared.csproj
  8. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/AccountRegisterVerifyCacheItem.cs
  9. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/AccountSettingNames.cs
  10. 3
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/PhoneNumberVerifyType.cs
  11. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN.Abp.Account.Domain.csproj
  12. 3
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountDomainModule.cs
  13. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountSettingDefinitionProvider.cs
  14. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/IIdentityUserRepository.cs
  15. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/Localization/Resources/en.json
  16. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/Localization/Resources/zh-Hans.json
  17. 48
      aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/Microsoft/AspNetCore/Identity/PhoneNumberUserValidator.cs
  18. 2
      aspnet-core/modules/account/LINGYUN.Abp.Account.HttpApi/LINGYUN.Abp.Account.HttpApi.csproj
  19. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.HttpApi/LINGYUN/Abp/Account/AccountController.cs
  20. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Application.Contracts/LINGYUN.ApiGateway.Application.Contracts.csproj
  21. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Application/LINGYUN.ApiGateway.Application.csproj
  22. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Domain.Shared/LINGYUN.ApiGateway.Domain.Shared.csproj
  23. 4
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Domain/LINGYUN.ApiGateway.Domain.csproj
  24. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.EntityFrameworkCore/LINGYUN.ApiGateway.EntityFrameworkCore.csproj
  25. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.HttpApi.Client/LINGYUN.ApiGateway.HttpApi.Client.csproj
  26. 2
      aspnet-core/modules/apigateway/LINGYUN.ApiGateway.HttpApi/LINGYUN.ApiGateway.HttpApi.csproj
  27. 7
      aspnet-core/modules/common/LINGYUN.Abp.DistributedLock/LINGYUN.Abp.DistributedLock.csproj
  28. 6
      aspnet-core/modules/common/LINGYUN.Abp.EventBus.CAP/LINGYUN.Abp.EventBus.CAP.csproj
  29. 20
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN.Abp.FileStorage.Qiniu.csproj
  30. 10
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/AbpQiniuFileStorageModule.cs
  31. 40
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/QiniuFileStorageOptions.cs
  32. 111
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/QiniuFileStorageProvider.cs
  33. 12
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN.Abp.FileStorage.csproj
  34. 8
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/AbpFileStorageModule.cs
  35. 8
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileDownloadCompletedEventArges.cs
  36. 11
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileDownloadProgressEventArges.cs
  37. 59
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileInfo.cs
  38. 63
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileStorageProvider.cs
  39. 8
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileUploadCompletedEventArges.cs
  40. 21
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileUploadProgressEventArges.cs
  41. 41
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/IFileStorageProvider.cs
  42. 39
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/IFileStore.cs
  43. 25
      aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/MediaType.cs
  44. 8
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN.Abp.IM.SignalR.csproj
  45. 6
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessageHub.cs
  46. 10
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN.Abp.IM.csproj
  47. 8
      aspnet-core/modules/common/LINGYUN.Abp.Identity.OverrideOptions/LINGYUN.Abp.Identity.OverrideOptions.csproj
  48. 8
      aspnet-core/modules/common/LINGYUN.Abp.IdentityServer.WeChatValidator/Class1.cs
  49. 12
      aspnet-core/modules/common/LINGYUN.Abp.IdentityServer.WeChatValidator/LINGYUN.Abp.IdentityServer.WeChatValidator.csproj
  50. 8
      aspnet-core/modules/common/LINGYUN.Abp.Location.Baidu/LINGYUN.Abp.Location.Baidu.csproj
  51. 4
      aspnet-core/modules/common/LINGYUN.Abp.Location/LINGYUN.Abp.Location.csproj
  52. 10
      aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN.Abp.Notifications.SignalR.csproj
  53. 9
      aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN.Abp.Notifications.csproj
  54. 8
      aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj
  55. 8
      aspnet-core/modules/common/LINGYUN.Abp.RedisLock/LINGYUN.Abp.RedisLock.csproj
  56. 8
      aspnet-core/modules/common/LINGYUN.Abp.Sms.Aliyun/LINGYUN.Abp.Sms.Aliyun.csproj
  57. 2
      aspnet-core/modules/common/LINGYUN.Common.EventBus/LINGYUN.Common.EventBus.csproj
  58. 4
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application.Contracts/LINGYUN.Abp.IdentityServer.Application.Contracts.csproj
  59. 1
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application.Contracts/LINGYUN/Abp/IdentityServer/Clients/Dto/ClientGetByPagedInputDto.cs
  60. 2
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN.Abp.IdentityServer.Application.csproj
  61. 3
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN/Abp/IdentityServer/Clients/ClientAppService.cs
  62. 3
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN/Abp/IdentityServer/IdentityResources/IdentityResourceAppService.cs
  63. 2
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.HttpApi/LINGYUN.Abp.IdentityServer.HttpApi.csproj
  64. 2
      aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.SmsValidator/LINGYUN.Abp.IdentityServer.SmsValidator.csproj
  65. 2
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN.Abp.MessageService.Domain.Shared.csproj
  66. 8
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN.Abp.MessageService.Domain.csproj
  67. 33
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/EventBus/Local/UserCreateSendWelcomeEventHandler.cs
  68. 2
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj
  69. 2
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN.Abp.MessageService.HttpApi.csproj
  70. 4
      aspnet-core/modules/permissions/LINGYUN.Abp.PermissionManagement.Application.Contracts/LINGYUN.Abp.PermissionManagement.Application.Contracts.csproj
  71. 4
      aspnet-core/modules/permissions/LINGYUN.Abp.PermissionManagement.Application/LINGYUN.Abp.PermissionManagement.Application.csproj
  72. 4
      aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application.Contracts/LINGYUN.Abp.SettingManagement.Application.Contracts.csproj
  73. 2
      aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj
  74. 2
      aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.HttpApi/LINGYUN.Abp.SettingManagement.HttpApi.csproj
  75. 4
      aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application.Contracts/LINGYUN.Abp.TenantManagement.Application.Contracts.csproj
  76. 2
      aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application/LINGYUN.Abp.TenantManagement.Application.csproj
  77. 2
      aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.HttpApi/LINGYUN.Abp.TenantManagement.HttpApi.csproj
  78. 18
      aspnet-core/services/account/AuthServer.Host/AuthServer.Host.csproj
  79. 16
      aspnet-core/services/account/AuthServer.Host/EntityFrameworkCore/Identity/EfCoreIdentityUserExtensionRepository.cs
  80. 8
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/LINGYUN.ApiGateway.Host.csproj
  81. 10
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/LINGYUN.ApiGateway.HttpApi.Host.csproj
  82. 7
      aspnet-core/services/cleanup-logs.bat
  83. 19
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/Identity/EfCoreIdentityUserExtensionRepository.cs
  84. 35
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/PlatformHttpApiHostMigrationsDbContext.cs
  85. 29
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/PlatformHttpApiHostMigrationsDbContextFactory.cs
  86. 11
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantConnectionStringCreateEventHandler.cs
  87. 2
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantCreateEventHandler.cs
  88. 2
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantDeleteEventHandler.cs
  89. 32
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/LINGYUN.Platform.HttpApi.Host.csproj
  90. 24
      vueJs/src/api/users.ts
  91. 1
      vueJs/src/components/LangSelect/index.vue
  92. 2
      vueJs/src/lang/zh.ts
  93. 2
      vueJs/src/permission.ts
  94. 5
      vueJs/src/router/index.ts
  95. 51
      vueJs/src/views/login/index.vue
  96. 4
      vueJs/src/views/register/index.vue
  97. 339
      vueJs/src/views/reset-password/index.vue

14
aspnet-core/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN.Abp.MessageService.HttpApi.Host.csproj

@ -22,13 +22,13 @@
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Autofac" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.9.0" />
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.9.0" />
<PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN.Abp.Account.Application.Contracts.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Account.Application.Contracts" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Account.Application.Contracts" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

24
aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN/Abp/Account/Dto/PasswordResetDto.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Auditing;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.Account
{
public class PasswordResetDto
{
[Required]
[Phone]
[StringLength(IdentityUserConsts.MaxPhoneNumberLength)]
public string PhoneNumber { get; set; }
[Required]
[StringLength(IdentityUserConsts.MaxPasswordLength)]
[DataType(DataType.Password)]
[DisableAuditing]
public string NewPassword { get; set; }
[Required]
[StringLength(6)]
public string VerifyCode { get; set; }
}
}

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Application.Contracts/LINGYUN/Abp/Account/IAccountAppService.cs

@ -8,6 +8,8 @@ namespace LINGYUN.Abp.Account
{ {
Task<IdentityUserDto> RegisterAsync(RegisterVerifyDto input); Task<IdentityUserDto> RegisterAsync(RegisterVerifyDto input);
Task ResetPasswordAsync(PasswordResetDto passwordReset);
Task VerifyPhoneNumberAsync(VerifyDto input); Task VerifyPhoneNumberAsync(VerifyDto input);
} }
} }

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN.Abp.Account.Application.csproj

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Account.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Account.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Sms" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Sms" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

119
aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/AccountAppService.cs

@ -8,6 +8,7 @@ using Volo.Abp.Caching;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Sms; using Volo.Abp.Sms;
using Volo.Abp.Uow;
namespace LINGYUN.Abp.Account namespace LINGYUN.Abp.Account
{ {
@ -18,18 +19,21 @@ namespace LINGYUN.Abp.Account
{ {
protected ISmsSender SmsSender { get; } protected ISmsSender SmsSender { get; }
protected IdentityUserManager UserManager { get; } protected IdentityUserManager UserManager { get; }
protected IdentityUserStore UserStore { get; }
protected IIdentityUserRepository UserRepository { get; } protected IIdentityUserRepository UserRepository { get; }
protected IDistributedCache<AccountRegisterVerifyCacheItem> Cache { get; } protected IDistributedCache<AccountRegisterVerifyCacheItem> Cache { get; }
protected PhoneNumberTokenProvider<IdentityUser> PhoneNumberTokenProvider { get; } protected PhoneNumberTokenProvider<IdentityUser> PhoneNumberTokenProvider { get; }
public AccountAppService( public AccountAppService(
ISmsSender smsSender, ISmsSender smsSender,
IdentityUserManager userManager, IdentityUserManager userManager,
IdentityUserStore userStore,
IIdentityUserRepository userRepository, IIdentityUserRepository userRepository,
IDistributedCache<AccountRegisterVerifyCacheItem> cache, IDistributedCache<AccountRegisterVerifyCacheItem> cache,
PhoneNumberTokenProvider<IdentityUser> phoneNumberTokenProvider) PhoneNumberTokenProvider<IdentityUser> phoneNumberTokenProvider)
{ {
Cache = cache; Cache = cache;
SmsSender = smsSender; SmsSender = smsSender;
UserStore = userStore;
UserManager = userManager; UserManager = userManager;
UserRepository = userRepository; UserRepository = userRepository;
PhoneNumberTokenProvider = phoneNumberTokenProvider; PhoneNumberTokenProvider = phoneNumberTokenProvider;
@ -57,22 +61,61 @@ namespace LINGYUN.Abp.Account
await CheckSelfRegistrationAsync(); await CheckSelfRegistrationAsync();
var userEmail = input.EmailAddress ?? input.PhoneNumber + "@abp.io"; // 需要用户输入邮箱?
//if (UserManager.Options.User.RequireUniqueEmail)
//{
// if (input.EmailAddress.IsNullOrWhiteSpace())
// {
// throw new UserFriendlyException(L["RequiredEmailAddress"]);
// }
//}
var userEmail = input.EmailAddress ?? $"{input.PhoneNumber}@{new Random().Next(1000, 99999)}.com";//如果邮件地址不验证,随意写入一个
var userName = input.UserName ?? input.PhoneNumber; var userName = input.UserName ?? input.PhoneNumber;
var user = new IdentityUser(GuidGenerator.Create(), userName, userEmail, CurrentTenant.Id) var user = new IdentityUser(GuidGenerator.Create(), userName, userEmail, CurrentTenant.Id)
{ {
Name = input.Name ?? input.PhoneNumber Name = input.Name ?? input.PhoneNumber
}; };
// 写入手机号要在创建用户之前,因为有一个自定义的手机号验证
await UserStore.SetPhoneNumberAsync(user, input.PhoneNumber);
await UserStore.SetPhoneNumberConfirmedAsync(user, true);
(await UserManager.CreateAsync(user, input.Password)).CheckErrors(); (await UserManager.CreateAsync(user, input.Password)).CheckErrors();
(await UserManager.SetPhoneNumberAsync(user, input.PhoneNumber)).CheckErrors();
(await UserManager.SetEmailAsync(user, userEmail)).CheckErrors();
(await UserManager.AddDefaultRolesAsync(user)).CheckErrors(); (await UserManager.AddDefaultRolesAsync(user)).CheckErrors();
await Cache.RemoveAsync(phoneVerifyCacheKey); await Cache.RemoveAsync(phoneVerifyCacheKey);
return ObjectMapper.Map<IdentityUser, IdentityUserDto>(user); return ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
} }
// TODO: 是否有必要移动到ProfileService
/// <summary>
/// 重置用户密码
/// </summary>
/// <param name="passwordReset"></param>
/// <returns></returns>
public virtual async Task ResetPasswordAsync(PasswordResetDto passwordReset)
{
// 本来可以不需要的,令牌算法有一个有效期
// 不过这里采用令牌强制过期策略,避免一个令牌多次使用
var phoneVerifyCacheKey = NormalizeCacheKey(passwordReset.PhoneNumber);
var phoneVerifyCacheItem = await Cache.GetAsync(phoneVerifyCacheKey);
if (phoneVerifyCacheItem == null || !phoneVerifyCacheItem.VerifyCode.Equals(passwordReset.VerifyCode))
{
throw new UserFriendlyException(L["PhoneVerifyCodeInvalid"]);
}
var userId = await GetUserIdByPhoneNumberAsync(passwordReset.PhoneNumber);
var user = await UserManager.GetByIdAsync(userId);
(await UserManager.ResetPasswordAsync(user, phoneVerifyCacheItem.VerifyToken, passwordReset.NewPassword)).CheckErrors();
await Cache.RemoveAsync(phoneVerifyCacheKey);
}
/// <summary> /// <summary>
/// 验证手机号码 /// 验证手机号码
/// </summary> /// </summary>
@ -110,18 +153,26 @@ namespace LINGYUN.Abp.Account
{ {
PhoneNumber = input.PhoneNumber, PhoneNumber = input.PhoneNumber,
}; };
if (input.VerifyType == PhoneNumberVerifyType.Register) switch (input.VerifyType)
{ {
var phoneVerifyCode = new Random().Next(100000, 999999); case PhoneNumberVerifyType.Register:
verifyCacheItem.VerifyCode = phoneVerifyCode.ToString(); var phoneVerifyCode = new Random().Next(100000, 999999);
var templateCode = await SettingProvider.GetOrNullAsync(AccountSettingNames.SmsRegisterTemplateCode); verifyCacheItem.VerifyCode = phoneVerifyCode.ToString();
await SendPhoneVerifyMessageAsync(templateCode, input.PhoneNumber, phoneVerifyCode.ToString()); var templateCode = await SettingProvider.GetOrNullAsync(AccountSettingNames.SmsRegisterTemplateCode);
} await SendPhoneVerifyMessageAsync(templateCode, input.PhoneNumber, phoneVerifyCode.ToString());
else return;
{ case PhoneNumberVerifyType.Signin:
var phoneVerifyCode = await SendSigninVerifyCodeAsync(input.PhoneNumber); var phoneSigninCode = await SendSigninVerifyCodeAsync(input.PhoneNumber);
verifyCacheItem.VerifyCode = phoneVerifyCode; verifyCacheItem.VerifyCode = phoneSigninCode;
break;
case PhoneNumberVerifyType.ResetPassword:
var resetPasswordCode = new Random().Next(100000, 999999);
verifyCacheItem.VerifyCode = resetPasswordCode.ToString();
var resetPasswordToken = await SendResetPasswordVerifyCodeAsync(input.PhoneNumber, verifyCacheItem.VerifyCode);
verifyCacheItem.VerifyToken = resetPasswordToken;
break;
} }
var cacheOptions = new DistributedCacheEntryOptions var cacheOptions = new DistributedCacheEntryOptions
{ {
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(verifyCodeExpiration) AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(verifyCodeExpiration)
@ -137,11 +188,7 @@ namespace LINGYUN.Abp.Account
protected virtual async Task<string> SendSigninVerifyCodeAsync(string phoneNumber) protected virtual async Task<string> SendSigninVerifyCodeAsync(string phoneNumber)
{ {
// 查找用户信息 // 查找用户信息
var user = await UserRepository.FindByPhoneNumberAsync(phoneNumber); var user = await GetUserByPhoneNumberAsync(phoneNumber);
if (user == null)
{
throw new UserFriendlyException(L["PhoneNumberNotRegisterd"]);
}
// 获取登录验证码模板号 // 获取登录验证码模板号
var templateCode = await SettingProvider.GetOrNullAsync(AccountSettingNames.SmsSigninTemplateCode); var templateCode = await SettingProvider.GetOrNullAsync(AccountSettingNames.SmsSigninTemplateCode);
// 生成手机验证码 // 生成手机验证码
@ -151,6 +198,42 @@ namespace LINGYUN.Abp.Account
return phoneVerifyCode; return phoneVerifyCode;
} }
protected virtual async Task<string> SendResetPasswordVerifyCodeAsync(string phoneNumber, string phoneVerifyCode)
{
// 查找用户信息
var user = await GetUserByPhoneNumberAsync(phoneNumber);
// 获取登录验证码模板号
var templateCode = await SettingProvider.GetOrNullAsync(AccountSettingNames.SmsResetPasswordTemplateCode);
// 生成重置密码验证码
var phoneVerifyToken = await UserManager.GeneratePasswordResetTokenAsync(user);
// 发送短信验证码
await SendPhoneVerifyMessageAsync(templateCode, user.PhoneNumber, phoneVerifyCode);
return phoneVerifyToken;
}
protected virtual async Task<IdentityUser> GetUserByPhoneNumberAsync(string phoneNumber)
{
// 查找用户信息
var user = await UserRepository.FindByPhoneNumberAsync(phoneNumber);
if (user == null)
{
throw new UserFriendlyException(L["PhoneNumberNotRegisterd"]);
}
return user;
}
protected virtual async Task<Guid> GetUserIdByPhoneNumberAsync(string phoneNumber)
{
// 查找用户信息
var userId = await UserRepository.GetIdByPhoneNumberAsync(phoneNumber);
if (!userId.HasValue)
{
throw new UserFriendlyException(L["PhoneNumberNotRegisterd"]);
}
return userId.Value;
}
/// <summary> /// <summary>
/// 检查是否允许用户注册 /// 检查是否允许用户注册
/// </summary> /// </summary>

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN.Abp.Account.Domain.Shared.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Localization" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Localization" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/AccountRegisterVerifyCacheItem.cs

@ -4,5 +4,6 @@
{ {
public string PhoneNumber { get; set; } public string PhoneNumber { get; set; }
public string VerifyCode { get; set; } public string VerifyCode { get; set; }
public string VerifyToken { get; set; }
} }
} }

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/AccountSettingNames.cs

@ -15,5 +15,9 @@
/// 用户登录短信验证码模板号 /// 用户登录短信验证码模板号
/// </summary> /// </summary>
public const string SmsSigninTemplateCode = GroupName + ".SmsSigninTemplateCode"; public const string SmsSigninTemplateCode = GroupName + ".SmsSigninTemplateCode";
/// <summary>
/// 用户重置密码短信验证码模板号
/// </summary>
public const string SmsResetPasswordTemplateCode = GroupName + ".SmsResetPasswordTemplateCode";
} }
} }

3
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain.Shared/LINGYUN/Abp/Account/PhoneNumberVerifyType.cs

@ -3,6 +3,7 @@
public enum PhoneNumberVerifyType : sbyte public enum PhoneNumberVerifyType : sbyte
{ {
Register = 0, Register = 0,
Signin = 10 Signin = 10,
ResetPassword = 20
} }
} }

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN.Abp.Account.Domain.csproj

@ -16,7 +16,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Identity.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

3
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountDomainModule.cs

@ -1,4 +1,5 @@
using Volo.Abp.Localization; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;

2
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/AbpAccountSettingDefinitionProvider.cs

@ -20,6 +20,8 @@ namespace LINGYUN.Abp.Account
"SMS_190728520", L("DisplayName:SmsRegisterTemplateCode"), L("Description:SmsRegisterTemplateCode")), "SMS_190728520", L("DisplayName:SmsRegisterTemplateCode"), L("Description:SmsRegisterTemplateCode")),
new SettingDefinition(AccountSettingNames.SmsSigninTemplateCode, new SettingDefinition(AccountSettingNames.SmsSigninTemplateCode,
"SMS_190728516", L("DisplayName:SmsSigninTemplateCode"), L("Description:SmsSigninTemplateCode")), "SMS_190728516", L("DisplayName:SmsSigninTemplateCode"), L("Description:SmsSigninTemplateCode")),
new SettingDefinition(AccountSettingNames.SmsResetPasswordTemplateCode,
"SMS_192530831", L("DisplayName:SmsResetPasswordTemplateCode"), L("Description:SmsResetPasswordTemplateCode")),
new SettingDefinition(AccountSettingNames.PhoneVerifyCodeExpiration, new SettingDefinition(AccountSettingNames.PhoneVerifyCodeExpiration,
"3", L("DisplayName:PhoneVerifyCodeExpiration"), L("Description:PhoneVerifyCodeExpiration")), "3", L("DisplayName:PhoneVerifyCodeExpiration"), L("Description:PhoneVerifyCodeExpiration")),
}; };

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/IIdentityUserRepository.cs

@ -7,6 +7,10 @@ namespace LINGYUN.Abp.Account
{ {
public interface IIdentityUserRepository : IReadOnlyRepository<IdentityUser, Guid> public interface IIdentityUserRepository : IReadOnlyRepository<IdentityUser, Guid>
{ {
Task<bool> PhoneNumberHasRegistedAsync(string phoneNumber);
Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber); Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber);
Task<Guid?> GetIdByPhoneNumberAsync(string phoneNumber);
} }
} }

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/Localization/Resources/en.json

@ -8,7 +8,12 @@
"Description:SmsRegisterTemplateCode": "When the user registers, he/she should send the template number of the SMS verification code and fill in the template number of the corresponding cloud platform registration", "Description:SmsRegisterTemplateCode": "When the user registers, he/she should send the template number of the SMS verification code and fill in the template number of the corresponding cloud platform registration",
"DisplayName:SmsSigninTemplateCode": "Signin sms template", "DisplayName:SmsSigninTemplateCode": "Signin sms template",
"Description:SmsSigninTemplateCode": "When the user logs in, he/she should send the template number of the SMS verification code and fill in the template number of the corresponding cloud platform registration", "Description:SmsSigninTemplateCode": "When the user logs in, he/she should send the template number of the SMS verification code and fill in the template number of the corresponding cloud platform registration",
"DisplayName:SmsResetPasswordTemplateCode": "Reset password sms template",
"Description:SmsResetPasswordTemplateCode": "When the user resets the password, he/she sends the template number of SMS verification code and fills in the template number registered on the cloud platform",
"DisplayName:PhoneVerifyCodeExpiration": "SMS verification code validity", "DisplayName:PhoneVerifyCodeExpiration": "SMS verification code validity",
"Description:PhoneVerifyCodeExpiration": "The valid time for the user to send SMS verification code, unit m, default 3m" "Description:PhoneVerifyCodeExpiration": "The valid time for the user to send SMS verification code, unit m, default 3m",
"RequiredEmailAddress": "Email address required",
"InvalidPhoneNumber": "Invalid phone number",
"DuplicatePhoneNumber": "The phone number {0} has been registered!"
} }
} }

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/LINGYUN/Abp/Account/Localization/Resources/zh-Hans.json

@ -8,7 +8,12 @@
"Description:SmsRegisterTemplateCode": "用户注册时发送短信验证码的模板号,填写对应云平台注册的模板号", "Description:SmsRegisterTemplateCode": "用户注册时发送短信验证码的模板号,填写对应云平台注册的模板号",
"DisplayName:SmsSigninTemplateCode": "用户登录短信模板", "DisplayName:SmsSigninTemplateCode": "用户登录短信模板",
"Description:SmsSigninTemplateCode": "用户登录时发送短信验证码的模板号,填写对应云平台注册的模板号", "Description:SmsSigninTemplateCode": "用户登录时发送短信验证码的模板号,填写对应云平台注册的模板号",
"DisplayName:SmsResetPasswordTemplateCode": "用户重置密码短信模板",
"Description:SmsResetPasswordTemplateCode": "用户重置密码时发送短信验证码的模板号,填写对应云平台注册的模板号",
"DisplayName:PhoneVerifyCodeExpiration": "短信验证码有效期", "DisplayName:PhoneVerifyCodeExpiration": "短信验证码有效期",
"Description:PhoneVerifyCodeExpiration": "用户发送短信验证码的有效时长,单位m,默认3m" "Description:PhoneVerifyCodeExpiration": "用户发送短信验证码的有效时长,单位m,默认3m",
"RequiredEmailAddress": "邮件地址必须输入",
"InvalidPhoneNumber": "手机号无效",
"DuplicatePhoneNumber": "手机号已经注册过!"
} }
} }

48
aspnet-core/modules/account/LINGYUN.Abp.Account.Domain/Microsoft/AspNetCore/Identity/PhoneNumberUserValidator.cs

@ -0,0 +1,48 @@
using LINGYUN.Abp.Account.Localization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity;
using IIdentityUserRepository = LINGYUN.Abp.Account.IIdentityUserRepository;
namespace Microsoft.AspNetCore.Identity
{
[Dependency(ServiceLifetime.Scoped, ReplaceServices = true)]
[ExposeServices(typeof(IUserValidator<IdentityUser>))]
public class PhoneNumberUserValidator : UserValidator<IdentityUser>
{
private readonly IStringLocalizer<AccountResource> _stringLocalizer;
private readonly IIdentityUserRepository _identityUserRepository;
public PhoneNumberUserValidator(
IStringLocalizer<AccountResource> stringLocalizer,
IIdentityUserRepository identityUserRepository)
{
_stringLocalizer = stringLocalizer;
_identityUserRepository = identityUserRepository;
}
public override async Task<IdentityResult> ValidateAsync(UserManager<IdentityUser> manager, IdentityUser user)
{
await ValidatePhoneNumberAsync(manager, user);
return await base.ValidateAsync(manager, user);
}
protected virtual async Task ValidatePhoneNumberAsync(UserManager<IdentityUser> manager, IdentityUser user)
{
var phoneNumber = await manager.GetPhoneNumberAsync(user);
if (phoneNumber.IsNullOrWhiteSpace())
{
throw new UserFriendlyException(_stringLocalizer["InvalidPhoneNumber"].Value, "InvalidPhoneNumber");
}
var phoneNumberHasRegisted = await _identityUserRepository.PhoneNumberHasRegistedAsync(phoneNumber);
if (phoneNumberHasRegisted)
{
throw new UserFriendlyException(_stringLocalizer["DuplicatePhoneNumber", phoneNumber].Value, "DuplicatePhoneNumber");
}
}
}
}

2
aspnet-core/modules/account/LINGYUN.Abp.Account.HttpApi/LINGYUN.Abp.Account.HttpApi.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

7
aspnet-core/modules/account/LINGYUN.Abp.Account.HttpApi/LINGYUN/Abp/Account/AccountController.cs

@ -32,5 +32,12 @@ namespace LINGYUN.Abp.Account
{ {
await AccountAppService.VerifyPhoneNumberAsync(input); await AccountAppService.VerifyPhoneNumberAsync(input);
} }
[HttpPut]
[Route("reset-password")]
public virtual async Task ResetPasswordAsync(PasswordResetDto passwordReset)
{
await AccountAppService.ResetPasswordAsync(passwordReset);
}
} }
} }

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Application.Contracts/LINGYUN.ApiGateway.Application.Contracts.csproj

@ -16,7 +16,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Application/LINGYUN.ApiGateway.Application.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AutoMapper" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Domain.Shared/LINGYUN.ApiGateway.Domain.Shared.csproj

@ -16,7 +16,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Localization" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Localization" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

4
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.Domain/LINGYUN.ApiGateway.Domain.csproj

@ -7,8 +7,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DotNetCore.CAP" Version="3.0.3" /> <PackageReference Include="DotNetCore.CAP" Version="3.0.3" />
<PackageReference Include="Volo.Abp.Caching" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Caching" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.EntityFrameworkCore/LINGYUN.ApiGateway.EntityFrameworkCore.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.HttpApi.Client/LINGYUN.ApiGateway.HttpApi.Client.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Http.Client" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Http.Client" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/apigateway/LINGYUN.ApiGateway.HttpApi/LINGYUN.ApiGateway.HttpApi.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

7
aspnet-core/modules/common/LINGYUN.Abp.DistributedLock/LINGYUN.Abp.DistributedLock.csproj

@ -3,6 +3,13 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

6
aspnet-core/modules/common/LINGYUN.Abp.EventBus.CAP/LINGYUN.Abp.EventBus.CAP.csproj

@ -5,7 +5,7 @@
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>2.8.0</Version> <Version>2.9.0</Version>
<Description>Cap分布式事件总线</Description> <Description>Cap分布式事件总线</Description>
</PropertyGroup> </PropertyGroup>
@ -16,8 +16,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DotNetCore.CAP" Version="3.0.3" /> <PackageReference Include="DotNetCore.CAP" Version="3.0.3" />
<PackageReference Include="Volo.Abp.BackgroundWorkers" Version="2.8.0" /> <PackageReference Include="Volo.Abp.BackgroundWorkers" Version="2.9.0" />
<PackageReference Include="Volo.Abp.EventBus" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EventBus" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

20
aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN.Abp.FileStorage.Qiniu.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Qiniu.Shared" Version="7.2.15" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.FileStorage\LINGYUN.Abp.FileStorage.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Qiniu\Http\" />
</ItemGroup>
</Project>

10
aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/AbpQiniuFileStorageModule.cs

@ -0,0 +1,10 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileStorage.Qiniu
{
[DependsOn(typeof(AbpFileStorageModule))]
public class AbpQiniuFileStorageModule : AbpModule
{
}
}

40
aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/QiniuFileStorageOptions.cs

@ -0,0 +1,40 @@
namespace LINGYUN.Abp.FileStorage.Qiniu
{
public class QiniuFileStorageOptions
{
/// <summary>
/// Api授权码
/// </summary>
public string AccessKey { get; set; }
/// <summary>
/// Api密钥
/// </summary>
public string SecretKey { get; set; }
/// <summary>
/// 默认自动删除该文件天数
/// 默认 0,不删除
/// </summary>
public int DeleteAfterDays { get; set; }
/// <summary>
/// 上传成功后,七牛云向业务服务器发送 POST 请求的 URL。
/// 必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL
/// </summary>
public string UploadCallbackUrl { get; set; }
/// <summary>
/// 上传成功后,七牛云向业务服务器发送回调通知时的 Host 值。
/// 与 callbackUrl 配合使用,仅当设置了 callbackUrl 时才有效。
/// </summary>
public string UploadCallbackHost { get; set; }
/// <summary>
/// 上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type。
/// 默认为 application/x-www-form-urlencoded,也可设置为 application/json。
/// </summary>
public string UploadCallbackBodyType { get; set; }
/// <summary>
/// 上传成功后,自定义七牛云最终返回給上传端(在指定 returnUrl 时是携带在跳转路径参数中)的数据。
/// 支持魔法变量和自定义变量。returnBody 要求是合法的 JSON 文本。
/// 例如 {"key": $(key), "hash": $(etag), "w": $(imageInfo.width), "h": $(imageInfo.height)}。
/// </summary>
public string UploadCallbackBody { get; set; }
}
}

111
aspnet-core/modules/common/LINGYUN.Abp.FileStorage.Qiniu/LINGYUN/Abp/FileStorage/Qiniu/QiniuFileStorageProvider.cs

@ -0,0 +1,111 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.RS;
using Qiniu.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.FileStorage.Qiniu
{
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IFileStorageProvider), typeof(FileStorageProvider))]
public class QiniuFileStorageProvider : FileStorageProvider
{
protected QiniuFileStorageOptions Options { get; }
public QiniuFileStorageProvider(
IFileStore store,
IOptions<QiniuFileStorageOptions> options)
: base(store)
{
Options = options.Value;
}
protected override async Task<FileInfo> DownloadFileAsync(FileInfo fileInfo, string saveLocalPath)
{
Mac mac = new Mac(Options.AccessKey, Options.SecretKey);
int expireInSeconds = 3600;
string accUrl = DownloadManager.CreateSignedUrl(mac, fileInfo.Url, expireInSeconds);
var saveLocalFile = Path.Combine(saveLocalPath, fileInfo.Name);
var httpResult = await DownloadManager.DownloadAsync(accUrl, saveLocalFile);
if(httpResult.Code == 200)
{
using (var fs = new FileStream(saveLocalFile, FileMode.Open, FileAccess.Read))
{
fileInfo.Data = new byte[fs.Length];
await fs.ReadAsync(fileInfo.Data, 0, fileInfo.Data.Length).ConfigureAwait(false);
}
}
else
{
// TODO: 处理响应代码
Console.WriteLine(httpResult.Code);
}
return fileInfo;
}
protected override async Task RemoveFileAsync(FileInfo fileInfo, CancellationToken cancellationToken = default)
{
Mac mac = new Mac(Options.AccessKey, Options.SecretKey);
var bucket = fileInfo.Directory + ":" + fileInfo.Name;
var backetManager = new BucketManager(mac);
await backetManager.DeleteAsync(bucket, fileInfo.Name);
throw new NotImplementedException();
}
protected override async Task UploadFileAsync(FileInfo fileInfo, int? expireIn = null, CancellationToken cancellationToken = default)
{
Mac mac = new Mac(Options.AccessKey, Options.SecretKey);
PutPolicy putPolicy = new PutPolicy
{
Scope = fileInfo.Directory + ":" + fileInfo.Name,
CallbackBody = Options.UploadCallbackBody,
CallbackBodyType = Options.UploadCallbackBodyType,
CallbackHost = Options.UploadCallbackHost,
CallbackUrl = Options.UploadCallbackUrl
};
if (expireIn.HasValue)
{
putPolicy.SetExpires(expireIn.Value);
}
if (Options.DeleteAfterDays > 0)
{
putPolicy.DeleteAfterDays = Options.DeleteAfterDays;
}
string jstr = putPolicy.ToJsonString();
string token = Auth.CreateUploadToken(mac, jstr);
UploadProgressHandler handler = (uploadByte, totalByte) =>
{
OnFileUploadProgressChanged(uploadByte, totalByte);
};
// 带进度的上传
ResumableUploader uploader = new ResumableUploader();
var httpResult = await uploader.UploadDataAsync(fileInfo.Data, fileInfo.Name, token, handler);
// 普通上传
//FormUploader fu = new FormUploader();
//var httpResult = await fu.UploadDataAsync(fileInfo.Data, fileInfo.Name, token);
// TODO: 处理响应代码
Console.WriteLine(httpResult.Code);
}
}
}

12
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN.Abp.FileStorage.csproj

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Core" Version="2.9.0" />
</ItemGroup>
</Project>

8
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/AbpFileStorageModule.cs

@ -0,0 +1,8 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.FileStorage
{
public class AbpFileStorageModule : AbpModule
{
}
}

8
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileDownloadCompletedEventArges.cs

@ -0,0 +1,8 @@
using System;
namespace LINGYUN.Abp.FileStorage
{
public class FileDownloadCompletedEventArges : EventArgs
{
}
}

11
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileDownloadProgressEventArges.cs

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace LINGYUN.Abp.FileStorage
{
public class FileDownloadProgressEventArges : EventArgs
{
}
}

59
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileInfo.cs

@ -0,0 +1,59 @@
using System;
namespace LINGYUN.Abp.FileStorage
{
/// <summary>
/// 文件信息
/// </summary>
public class FileInfo
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 大小
/// </summary>
public long Size { get; set; }
/// <summary>
/// 文件路径
/// </summary>
public string Directory { get; set; }
/// <summary>
/// 文件扩展名
/// </summary>
public string Extension { get; set; }
/// <summary>
/// 文件哈希码,用于唯一标识
/// </summary>
public string Hash { get; set; }
/// <summary>
/// 文件链接
/// </summary>
public string Url { get; set; }
/// <summary>
/// 文件数据
/// </summary>
public byte[] Data { get; set; }
/// <summary>
/// 媒体类型
/// </summary>
public MediaType MediaType { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
public Guid? CreatorId { get; set; }
/// <summary>
/// 上次变更时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 上次变更人
/// </summary>
public Guid? LastModifierId { get; set; }
}
}

63
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileStorageProvider.cs

@ -0,0 +1,63 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.FileStorage
{
public abstract class FileStorageProvider : IFileStorageProvider
{
public event EventHandler<FileDownloadProgressEventArges> FileDownloadProgressChanged;
public event EventHandler<FileDownloadCompletedEventArges> FileDownloadCompleted;
public event EventHandler<FileUploadProgressEventArges> FileUploadProgressChanged;
public event EventHandler<FileUploadCompletedEventArges> FileUploadCompleted;
protected IFileStore Store { get; }
public FileStorageProvider(IFileStore store)
{
Store = store;
}
public async Task DeleteFileAsync(string hash, CancellationToken cancellationToken = default)
{
// 获取文件信息
var file = await Store.GetFileAsync(hash);
// 删除文件
await RemoveFileAsync(file, cancellationToken);
// 删除文件信息
await Store.DeleteFileAsync(hash, cancellationToken);
}
public async Task<FileInfo> GetFileAsync(string hash, string saveLocalPath)
{
// 获取文件信息
var file = await Store.GetFileAsync(hash);
// 下载文件
return await DownloadFileAsync(file, saveLocalPath);
}
public async Task StorageAsync(FileInfo fileInfo, int? expireIn = null, CancellationToken cancellationToken = default)
{
// step1 上传文件
await UploadFileAsync(fileInfo, expireIn, cancellationToken);
// step2 保存文件信息
await Store.StorageAsync(fileInfo, expireIn, cancellationToken);
}
protected abstract Task UploadFileAsync(FileInfo fileInfo, int? expireIn = null, CancellationToken cancellationToken = default);
protected abstract Task<FileInfo> DownloadFileAsync(FileInfo fileInfo, string saveLocalPath);
protected abstract Task RemoveFileAsync(FileInfo fileInfo, CancellationToken cancellationToken = default);
protected virtual void OnFileUploadProgressChanged(long sent, long total)
{
FileUploadProgressChanged?.Invoke(this, new FileUploadProgressEventArges(sent, total));
}
protected virtual void OnFileUploadConpleted()
{
FileUploadCompleted?.Invoke(this, new FileUploadCompletedEventArges());
}
}
}

8
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileUploadCompletedEventArges.cs

@ -0,0 +1,8 @@
using System;
namespace LINGYUN.Abp.FileStorage
{
public class FileUploadCompletedEventArges : EventArgs
{
}
}

21
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/FileUploadProgressEventArges.cs

@ -0,0 +1,21 @@
using System;
namespace LINGYUN.Abp.FileStorage
{
public class FileUploadProgressEventArges : EventArgs
{
/// <summary>
/// 上传数据大小
/// </summary>
public long BytesSent { get; }
/// <summary>
/// 总数据大小
/// </summary>
public long TotalBytesSent { get; }
public FileUploadProgressEventArges(long sent, long total)
{
BytesSent = sent;
TotalBytesSent = total;
}
}
}

41
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/IFileStorageProvider.cs

@ -0,0 +1,41 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.FileStorage
{
/// <summary>
/// 文件存储提供者
/// </summary>
public interface IFileStorageProvider
{
event EventHandler<FileDownloadProgressEventArges> FileDownloadProgressChanged;
event EventHandler<FileDownloadCompletedEventArges> FileDownloadCompleted;
event EventHandler<FileUploadProgressEventArges> FileUploadProgressChanged;
event EventHandler<FileUploadCompletedEventArges> FileUploadCompleted;
/// <summary>
/// 存储文件
/// </summary>
/// <param name="fileInfo">文件信息</param>
/// <param name="expireIn">过期时间,单位(s)</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task StorageAsync(FileInfo fileInfo, int? expireIn = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取文件
/// </summary>
/// <param name="hash">文件唯一标识</param>
/// <param name="saveLocalPath">保存到本地路径</param>
/// <returns></returns>
Task<FileInfo> GetFileAsync(string hash, string saveLocalPath);
/// <summary>
/// 删除文件
/// </summary>
/// <param name="hash">文件唯一标识</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task DeleteFileAsync(string hash, CancellationToken cancellationToken = default);
}
}

39
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/IFileStore.cs

@ -0,0 +1,39 @@
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.FileStorage
{
/// <summary>
/// 文件存储接口
/// </summary>
public interface IFileStore
{
/// <summary>
/// 存储文件
/// </summary>
/// <param name="fileInfo">文件信息</param>
/// <param name="expireIn">过期时间,单位(s)</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task StorageAsync(FileInfo fileInfo, int? expireIn = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取文件
/// </summary>
/// <param name="hash">文件唯一标识</param>
/// <returns></returns>
Task<FileInfo> GetFileAsync(string hash);
/// <summary>
/// 文件是否存在
/// </summary>
/// <param name="hash">文件唯一标识</param>
/// <returns></returns>
Task<bool> FileHasExistsAsync(string hash);
/// <summary>
/// 删除文件
/// </summary>
/// <param name="hash">文件唯一标识</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task DeleteFileAsync(string hash, CancellationToken cancellationToken = default);
}
}

25
aspnet-core/modules/common/LINGYUN.Abp.FileStorage/LINGYUN/Abp/FileStorage/MediaType.cs

@ -0,0 +1,25 @@
namespace LINGYUN.Abp.FileStorage
{
/// <summary>
/// 媒体类型
/// </summary>
public enum MediaType
{
/// <summary>
/// 文档
/// </summary>
Document = 0,
/// <summary>
/// 图像
/// </summary>
Image = 2,
/// <summary>
/// 影像
/// </summary>
Video = 3,
/// <summary>
/// 音乐
/// </summary>
Music = 4
}
}

8
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN.Abp.IM.SignalR.csproj

@ -3,10 +3,16 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

6
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessageHub.cs

@ -65,6 +65,12 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{ {
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault());
var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext);
// 需要捕捉每一个发送任务的异常吗?
// var onlineClientConnections = onlineClients.Select(c => c.ConnectionId).ToImmutableList();
// var signalRClient = Clients.Clients(onlineClientConnections);
// await signalRClient.SendAsync("getChatMessage", chatMessage);
foreach (var onlineClient in onlineClients) foreach (var onlineClient in onlineClients)
{ {
try try

10
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN.Abp.IM.csproj

@ -1,12 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Auditing" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Auditing" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

8
aspnet-core/modules/common/LINGYUN.Abp.Identity.OverrideOptions/LINGYUN.Abp.Identity.OverrideOptions.csproj

@ -3,10 +3,16 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Identity.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

8
aspnet-core/modules/common/LINGYUN.Abp.IdentityServer.WeChatValidator/Class1.cs

@ -0,0 +1,8 @@
using System;
namespace LINGYUN.Abp.IdentityServer.WeChatValidator
{
public class Class1
{
}
}

12
aspnet-core/modules/common/LINGYUN.Abp.IdentityServer.WeChatValidator/LINGYUN.Abp.IdentityServer.WeChatValidator.csproj

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="2.9.0" />
</ItemGroup>
</Project>

8
aspnet-core/modules/common/LINGYUN.Abp.Location.Baidu/LINGYUN.Abp.Location.Baidu.csproj

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>2.8.0</Version> <Version>2.9.0</Version>
<Description>百度位置服务</Description> <Description>百度位置服务</Description>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup> </PropertyGroup>
@ -25,9 +25,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="3.1.2" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="3.1.2" />
<PackageReference Include="Volo.Abp.Localization" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Localization" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Json" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Json" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Threading" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Threading" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

4
aspnet-core/modules/common/LINGYUN.Abp.Location/LINGYUN.Abp.Location.csproj

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.8.0</Version> <Version>2.9.0</Version>
<Description>位置服务</Description> <Description>位置服务</Description>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
</PropertyGroup> </PropertyGroup>
@ -14,7 +14,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Core" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Core" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

10
aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN.Abp.Notifications.SignalR.csproj

@ -3,11 +3,17 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

9
aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN.Abp.Notifications.csproj

@ -3,10 +3,17 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Json" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Json" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

8
aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj

@ -3,10 +3,16 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<Version>2.9.0</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Core" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Core" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

8
aspnet-core/modules/common/LINGYUN.Abp.RedisLock/LINGYUN.Abp.RedisLock.csproj

@ -3,13 +3,19 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>D:\LocalNuget</OutputPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.2" /> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.2" /> <PackageReference Include="Microsoft.Extensions.Options" Version="3.1.2" />
<PackageReference Include="Polly" Version="7.2.1" /> <PackageReference Include="Polly" Version="7.2.1" />
<PackageReference Include="Volo.Abp.Core" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Core" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

8
aspnet-core/modules/common/LINGYUN.Abp.Sms.Aliyun/LINGYUN.Abp.Sms.Aliyun.csproj

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace /> <RootNamespace />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>2.8.0</Version> <Version>2.9.0</Version>
<Description>阿里云短信服务</Description> <Description>阿里云短信服务</Description>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup> </PropertyGroup>
@ -25,9 +25,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" /> <PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" />
<PackageReference Include="Volo.Abp.Json" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Json" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Localization" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Localization" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Sms" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Sms" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

2
aspnet-core/modules/common/LINGYUN.Common.EventBus/LINGYUN.Common.EventBus.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.EventBus" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EventBus" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

4
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application.Contracts/LINGYUN.Abp.IdentityServer.Application.Contracts.csproj

@ -16,8 +16,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.IdentityServer.Domain.Shared" Version="2.8.0" /> <PackageReference Include="Volo.Abp.IdentityServer.Domain.Shared" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

1
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application.Contracts/LINGYUN/Abp/IdentityServer/Clients/Dto/ClientGetByPagedInputDto.cs

@ -4,5 +4,6 @@ namespace LINGYUN.Abp.IdentityServer.Clients
{ {
public class ClientGetByPagedInputDto : PagedAndSortedResultRequestDto public class ClientGetByPagedInputDto : PagedAndSortedResultRequestDto
{ {
public string Filter { get; set; }
} }
} }

2
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN.Abp.IdentityServer.Application.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

3
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN/Abp/IdentityServer/Clients/ClientAppService.cs

@ -141,7 +141,8 @@ namespace LINGYUN.Abp.IdentityServer.Clients
{ {
// Abp官方IdentityServer项目不支持Filter过滤... // Abp官方IdentityServer项目不支持Filter过滤...
var clients = await ClientRepository.GetListAsync(clientGetByPaged.Sorting, var clients = await ClientRepository.GetListAsync(clientGetByPaged.Sorting,
clientGetByPaged.SkipCount, clientGetByPaged.MaxResultCount, true); clientGetByPaged.SkipCount, clientGetByPaged.MaxResultCount,
clientGetByPaged.Filter, true);
var clientCount = await ClientRepository.GetCountAsync(); var clientCount = await ClientRepository.GetCountAsync();

3
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Application/LINGYUN/Abp/IdentityServer/IdentityResources/IdentityResourceAppService.cs

@ -28,7 +28,8 @@ namespace LINGYUN.Abp.IdentityServer.IdentityResources
public virtual async Task<PagedResultDto<IdentityResourceDto>> GetAsync(IdentityResourceGetByPagedInputDto identityResourceGetByPaged) public virtual async Task<PagedResultDto<IdentityResourceDto>> GetAsync(IdentityResourceGetByPagedInputDto identityResourceGetByPaged)
{ {
var identityResources = await IdentityResourceRepository.GetListAsync(identityResourceGetByPaged.Sorting, var identityResources = await IdentityResourceRepository.GetListAsync(identityResourceGetByPaged.Sorting,
identityResourceGetByPaged.SkipCount, identityResourceGetByPaged.MaxResultCount, true); identityResourceGetByPaged.SkipCount, identityResourceGetByPaged.MaxResultCount,
identityResourceGetByPaged.Filter, true);
var identityResourceCount = await IdentityResourceRepository.GetCountAsync(); var identityResourceCount = await IdentityResourceRepository.GetCountAsync();
return new PagedResultDto<IdentityResourceDto>(identityResourceCount, return new PagedResultDto<IdentityResourceDto>(identityResourceCount,

2
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.HttpApi/LINGYUN.Abp.IdentityServer.HttpApi.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.SmsValidator/LINGYUN.Abp.IdentityServer.SmsValidator.csproj

@ -16,7 +16,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN.Abp.MessageService.Domain.Shared.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Localization" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Localization" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

8
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN.Abp.MessageService.Domain.csproj

@ -16,10 +16,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Domain" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AutoMapper" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AutoMapper" Version="2.9.0" />
<PackageReference Include="Volo.Abp.BackgroundJobs" Version="2.8.0" /> <PackageReference Include="Volo.Abp.BackgroundJobs" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Users.Abstractions" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Users.Abstractions" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

33
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/EventBus/Local/UserCreateSendWelcomeEventHandler.cs

@ -44,26 +44,29 @@ namespace LINGYUN.Abp.MessageService.EventBus
{ {
// 获取默认语言 // 获取默认语言
var userDefaultCultureName = await _settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); var userDefaultCultureName = await _settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage);
if (!userDefaultCultureName.IsNullOrWhiteSpace()) if (userDefaultCultureName.IsNullOrWhiteSpace())
{ {
CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo(userDefaultCultureName); userDefaultCultureName = CultureInfo.CurrentUICulture.Name;
// CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(userDefaultCultureName); // CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(userDefaultCultureName);
} }
// 订阅用户欢迎消息 using (CultureHelper.Use(userDefaultCultureName, userDefaultCultureName))
await _notificationStore.InsertUserSubscriptionAsync(eventData.Entity.TenantId,
eventData.Entity.Id, UserNotificationNames.WelcomeToApplication);
var userWelcomeNotifiction = new NotificationInfo
{ {
CreationTime = DateTime.Now, // 订阅用户欢迎消息
Name = UserNotificationNames.WelcomeToApplication, await _notificationStore.InsertUserSubscriptionAsync(eventData.Entity.TenantId,
NotificationSeverity = NotificationSeverity.Info, eventData.Entity.Id, UserNotificationNames.WelcomeToApplication);
NotificationType = NotificationType.System,
TenantId = eventData.Entity.TenantId var userWelcomeNotifiction = new NotificationInfo
}; {
userWelcomeNotifiction.Data.Properties["message"] = L("WelcomeToApplicationFormUser", eventData.Entity.UserName); CreationTime = DateTime.Now,
Name = UserNotificationNames.WelcomeToApplication,
NotificationSeverity = NotificationSeverity.Info,
NotificationType = NotificationType.System,
TenantId = eventData.Entity.TenantId
};
userWelcomeNotifiction.Data.Properties["message"] = L("WelcomeToApplicationFormUser", eventData.Entity.UserName);
await _notificationDispatcher.DispatcheAsync(userWelcomeNotifiction); await _notificationDispatcher.DispatcheAsync(userWelcomeNotifiction);
}
} }
//public async Task HandleEventAsync(EntityCreatedEventData<UserEto> eventData) //public async Task HandleEventAsync(EntityCreatedEventData<UserEto> eventData)

2
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN.Abp.MessageService.HttpApi.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

4
aspnet-core/modules/permissions/LINGYUN.Abp.PermissionManagement.Application.Contracts/LINGYUN.Abp.PermissionManagement.Application.Contracts.csproj

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Shared" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain.Shared" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

4
aspnet-core/modules/permissions/LINGYUN.Abp.PermissionManagement.Application/LINGYUN.Abp.PermissionManagement.Application.csproj

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.PermissionManagement.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.Application.Contracts" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.Application.Contracts" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

4
aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application.Contracts/LINGYUN.Abp.SettingManagement.Application.Contracts.csproj

@ -16,8 +16,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

2
aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj

@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.HttpApi/LINGYUN.Abp.SettingManagement.HttpApi.csproj

@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

4
aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application.Contracts/LINGYUN.Abp.TenantManagement.Application.Contracts.csproj

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Ddd.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.TenantManagement.Domain.Shared" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.Domain.Shared" Version="2.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

2
aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.Application/LINGYUN.Abp.TenantManagement.Application.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.TenantManagement.Domain" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.Domain" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/tenants/LINGYUN.Abp.TenantManagement.HttpApi/LINGYUN.Abp.TenantManagement.HttpApi.csproj

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

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

@ -20,15 +20,15 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Volo.Abp.Autofac" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Identity.AspNetCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.AspNetCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="2.9.0" />
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySql" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySql" Version="2.9.0" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

16
aspnet-core/services/account/AuthServer.Host/EntityFrameworkCore/Identity/EfCoreIdentityUserExtensionRepository.cs

@ -19,10 +19,24 @@ namespace AuthServer.Host.EntityFrameworkCore.Identity
{ {
} }
public async Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber) public virtual async Task<bool> PhoneNumberHasRegistedAsync(string phoneNumber)
{
return await DbSet.AnyAsync(x => x.PhoneNumberConfirmed && x.PhoneNumber.Equals(phoneNumber));
}
public virtual async Task<Guid?> GetIdByPhoneNumberAsync(string phoneNumber)
{
return await DbSet
.Where(x => x.PhoneNumber.Equals(phoneNumber))
.Select(x => x.Id)
.FirstOrDefaultAsync();
}
public virtual async Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber)
{ {
return await WithDetails() return await WithDetails()
.Where(usr => usr.PhoneNumber.Equals(phoneNumber)) .Where(usr => usr.PhoneNumber.Equals(phoneNumber))
.AsNoTracking()
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
} }

8
aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/LINGYUN.ApiGateway.Host.csproj

@ -17,10 +17,10 @@
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" /> <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
<PackageReference Include="Volo.Abp.Autofac" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AspNetCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AutoMapper" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AutoMapper" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Http.Client.IdentityModel" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Http.Client.IdentityModel" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

10
aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/LINGYUN.ApiGateway.HttpApi.Host.csproj

@ -28,11 +28,11 @@
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Volo.Abp.Autofac" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.9.0" />
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.9.0" />
<PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

7
aspnet-core/services/cleanup-logs.bat

@ -2,7 +2,10 @@
cls cls
chcp 65001 chcp 65001
echo. 启动平台管理服务 echo. 清理所有服务日志
cd .\platform\LINGYUN.Platform.HttpApi.Host del .\platform\LINGYUN.Platform.HttpApi.Host\Logs /y
del .\apigateway\LINGYUN.ApiGateway.Host\Logs /y
del .\apigateway\LINGYUN.ApiGateway.HttpApi.Host\Logs /y
del .\account\AuthServer.Host\Logs /y

19
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/Identity/EfCoreIdentityUserExtensionRepository.cs

@ -19,9 +19,24 @@ namespace LINGYUN.Platform.EntityFrameworkCore.Identity
{ {
} }
public async Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber) public virtual async Task<bool> PhoneNumberHasRegistedAsync(string phoneNumber)
{ {
return await DbSet.Where(usr => usr.PhoneNumber.Equals(phoneNumber)).FirstOrDefaultAsync(); return await DbSet.AnyAsync(x => x.PhoneNumberConfirmed && x.PhoneNumber.Equals(phoneNumber));
}
public virtual async Task<Guid?> GetIdByPhoneNumberAsync(string phoneNumber)
{
return await DbSet
.Where(x => x.PhoneNumber.Equals(phoneNumber))
.Select(x => x.Id)
.FirstOrDefaultAsync();
}
public virtual async Task<IdentityUser> FindByPhoneNumberAsync(string phoneNumber)
{
return await DbSet.Where(usr => usr.PhoneNumber.Equals(phoneNumber))
.AsNoTracking()
.FirstOrDefaultAsync();
} }
} }
} }

35
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/PlatformHttpApiHostMigrationsDbContext.cs

@ -0,0 +1,35 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Identity.EntityFrameworkCore;
using Volo.Abp.IdentityServer.EntityFrameworkCore;
using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace LINGYUN.Platform.EntityFrameworkCore
{
public class PlatformHttpApiHostMigrationsDbContext : AbpDbContext<PlatformHttpApiHostMigrationsDbContext>
{
public PlatformHttpApiHostMigrationsDbContext(DbContextOptions<PlatformHttpApiHostMigrationsDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureIdentityServer(options =>
{
options.TablePrefix = "IdentityServer";
options.Schema = null;
options.DatabaseProvider = EfCoreDatabaseProvider.MySql;
});
modelBuilder.ConfigureTenantManagement();
modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigurePermissionManagement();
}
}
}

29
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EntityFrameworkCore/PlatformHttpApiHostMigrationsDbContextFactory.cs

@ -0,0 +1,29 @@
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace LINGYUN.Platform.EntityFrameworkCore
{
public class PlatformHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<PlatformHttpApiHostMigrationsDbContext>
{
public PlatformHttpApiHostMigrationsDbContext CreateDbContext(string[] args)
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<PlatformHttpApiHostMigrationsDbContext>()
.UseMySql(configuration.GetConnectionString("Default"));
return new PlatformHttpApiHostMigrationsDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.Development.json", optional: false);
return builder.Build();
}
}
}

11
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantConnectionStringCreateEventHandler.cs

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LINGYUN.Platform.EventBus.Handlers
{
public class TenantConnectionStringCreateEventHandler
{
}
}

2
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantCreateEventHandler.cs

@ -70,7 +70,7 @@ namespace LINGYUN.Platform.EventBus.Handlers
} }
await PermissionGrantRepository.GetDbContext().Database.ExecuteSqlRawAsync(batchInsertPermissionSql); await PermissionGrantRepository.GetDbContext().Database.ExecuteSqlRawAsync(batchInsertPermissionSql);
await unitOfWork.CompleteAsync(); await unitOfWork.SaveChangesAsync();
} }
} }
} }

2
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/EventBus/Handlers/TenantDeleteEventHandler.cs

@ -57,7 +57,7 @@ namespace LINGYUN.Platform.EventBus.Handlers
await PermissionGrantRepository.GetDbContext().Database await PermissionGrantRepository.GetDbContext().Database
.ExecuteSqlRawAsync(batchRmovePermissionSql); .ExecuteSqlRawAsync(batchRmovePermissionSql);
await unitOfWork.CompleteAsync(); await unitOfWork.SaveChangesAsync();
} }
} }

32
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/LINGYUN.Platform.HttpApi.Host.csproj

@ -32,22 +32,22 @@
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="2.9.0" />
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="2.8.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Autofac" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.9.0" />
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.8.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Identity.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Identity.HttpApi" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.HttpApi" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Account.Application" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Account.Application" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Account.HttpApi" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Account.HttpApi" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Identity" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain.Identity" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.HttpApi" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.HttpApi" Version="2.9.0" />
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="2.9.0" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.8.0" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="2.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

24
vueJs/src/api/users.ts

@ -79,6 +79,16 @@ export default class UserApiService {
}) })
} }
public static resetPassword(input: UserResetPasswordData) {
const _url = '/api/account/phone/reset-password'
return ApiService.HttpRequest({
baseURL: IdentityServiceUrl,
url: _url,
data: input,
method: 'PUT'
})
}
public static userRegister(registerData: UserRegisterData) { public static userRegister(registerData: UserRegisterData) {
const _url = '/api/account/phone/register' const _url = '/api/account/phone/register'
return ApiService.HttpRequest<UserDataDto>({ return ApiService.HttpRequest<UserDataDto>({
@ -224,8 +234,9 @@ export class UserLoginData {
} }
export enum VerifyType { export enum VerifyType {
register = 0, Register = 0,
signin = 10 Signin = 10,
ResetPassword = 20
} }
export class PhoneVerify { export class PhoneVerify {
@ -233,6 +244,15 @@ export class PhoneVerify {
verifyType!:VerifyType verifyType!:VerifyType
} }
export class UserResetPasswordData {
/** 手机号码 */
phoneNumber!: string
/** 手机验证码 */
verifyCode!: string
/** 新密码 */
newPassword!: string
}
/** 用户手机登录对象 */ /** 用户手机登录对象 */
export class UserLoginPhoneData { export class UserLoginPhoneData {
/** 手机号码 */ /** 手机号码 */

1
vueJs/src/components/LangSelect/index.vue

@ -30,6 +30,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator' import { Component, Vue, Watch } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app' import { AppModule } from '@/store/modules/app'
import { AbpConfigurationModule } from '@/store/modules/abp'
@Component({ @Component({
name: 'Login' name: 'Login'

2
vueJs/src/lang/zh.ts

@ -93,8 +93,10 @@ export default {
register: '注册', register: '注册',
notAccount: '没有账户?', notAccount: '没有账户?',
existsAccount: '已有账户?', existsAccount: '已有账户?',
forgotPassword: '忘记密码?',
userLogin: '用户密码登录', userLogin: '用户密码登录',
phoneLogin: '手机免密登录', phoneLogin: '手机免密登录',
resetpassword: '重置密码',
tenantName: '租户', tenantName: '租户',
username: '账号', username: '账号',
password: '密码', password: '密码',

2
vueJs/src/permission.ts

@ -11,7 +11,7 @@ import settings from './settings'
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/auth-redirect', '/register'] const whiteList = ['/login', '/auth-redirect', '/register', '/reset-password']
const getPageTitle = (key: string) => { const getPageTitle = (key: string) => {
const hasKey = i18n.te(`route.${key}`) const hasKey = i18n.te(`route.${key}`)

5
vueJs/src/router/index.ts

@ -66,6 +66,11 @@ export const constantRoutes: RouteConfig[] = [
component: () => import(/* webpackChunkName: "login" */ '@/views/register/index.vue'), component: () => import(/* webpackChunkName: "login" */ '@/views/register/index.vue'),
meta: { hidden: true } meta: { hidden: true }
}, },
{
path: '/reset-password',
component: () => import(/* webpackChunkName: "login" */ '@/views/reset-password/index.vue'),
meta: { hidden: true }
},
{ {
path: '/auth-redirect', path: '/auth-redirect',
component: () => import(/* webpackChunkName: "auth-redirect" */ '@/views/login/auth-redirect.vue'), component: () => import(/* webpackChunkName: "auth-redirect" */ '@/views/login/auth-redirect.vue'),

51
vueJs/src/views/login/index.vue

@ -104,18 +104,37 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<el-form-item
v-show="selfRegistration" <el-row>
label-width="100px" <el-col :span="12">
:label="$t('login.notAccount')" <el-form-item
> v-show="selfRegistration"
<el-link label-width="100px"
type="success" :label="$t('login.notAccount')"
@click="handleRedirectRegister" >
> <el-link
{{ $t('login.register') }} type="success"
</el-link> @click="handleRedirectRegister"
</el-form-item> >
{{ $t('login.register') }}
</el-link>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
v-show="selfRegistration"
label-width="100px"
:label="$t('login.forgotPassword')"
>
<el-link
type="info"
@click="handleRedirectResetPassword"
>
{{ $t('login.resetpassword') }}
</el-link>
</el-form-item>
</el-col>
</el-row>
<el-form-item style="width:100%;"> <el-form-item style="width:100%;">
<el-button <el-button
@ -167,7 +186,7 @@ export default class extends Vue {
} }
get isMultiEnabled() { get isMultiEnabled() {
return AbpConfigurationModule.configuration.multiTenancy.isEnabled return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled
} }
get selfRegistration() { get selfRegistration() {
@ -241,6 +260,10 @@ export default class extends Vue {
this.$router.replace('register') this.$router.replace('register')
} }
private handleRedirectResetPassword() {
this.$router.replace('reset-password')
}
private handleUserLogin() { private handleUserLogin() {
const frmLogin = this.$refs.formLogin as any const frmLogin = this.$refs.formLogin as any
frmLogin.validate(async(valid: boolean) => { frmLogin.validate(async(valid: boolean) => {
@ -282,7 +305,7 @@ export default class extends Vue {
this.sending = true this.sending = true
const phoneVerify = new PhoneVerify() const phoneVerify = new PhoneVerify()
phoneVerify.phoneNumber = this.loginForm.phoneNumber phoneVerify.phoneNumber = this.loginForm.phoneNumber
phoneVerify.verifyType = VerifyType.signin phoneVerify.verifyType = VerifyType.Signin
UserService.sendPhoneVerifyCode(phoneVerify).then(() => { UserService.sendPhoneVerifyCode(phoneVerify).then(() => {
let interValTime = 60 let interValTime = 60
const sendingName = this.l('login.afterSendVerifyCode') const sendingName = this.l('login.afterSendVerifyCode')

4
vueJs/src/views/register/index.vue

@ -151,7 +151,7 @@ export default class extends Vue {
} }
get isMultiEnabled() { get isMultiEnabled() {
return AbpConfigurationModule.configuration.multiTenancy.isEnabled return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled
} }
private validatePhoneNumberValue = (rule: any, value: string, callback: any) => { private validatePhoneNumberValue = (rule: any, value: string, callback: any) => {
@ -248,7 +248,7 @@ export default class extends Vue {
this.sending = true this.sending = true
const phoneVerify = new PhoneVerify() const phoneVerify = new PhoneVerify()
phoneVerify.phoneNumber = this.registerForm.phoneNumber phoneVerify.phoneNumber = this.registerForm.phoneNumber
phoneVerify.verifyType = VerifyType.register phoneVerify.verifyType = VerifyType.Register
UserService.sendPhoneVerifyCode(phoneVerify).then(() => { UserService.sendPhoneVerifyCode(phoneVerify).then(() => {
let interValTime = 60 let interValTime = 60
const sendingName = this.l('login.afterSendVerifyCode') const sendingName = this.l('login.afterSendVerifyCode')

339
vueJs/src/views/reset-password/index.vue

@ -0,0 +1,339 @@
<template>
<div class="login-container">
<el-form
ref="formResetPassword"
:model="resetPasswordForm"
:rules="resetPasswordFormRules"
label-position="left"
label-width="0px"
class="demo-ruleForm login-page"
>
<div class="title-container">
<h3 class="title">
{{ $t('login.resetpassword') }}
</h3>
<lang-select class="set-language" />
</div>
<el-form-item label-width="0px">
<tenant-box
v-if="isMultiEnabled"
v-model="resetPasswordForm.tenantName"
/>
</el-form-item>
<el-form-item
prop="phoneNumber"
>
<el-input
v-model="resetPasswordForm.phoneNumber"
prefix-icon="el-icon-mobile-phone"
type="text"
maxlength="11"
auto-complete="off"
:placeholder="$t('global.pleaseInputBy', {key: $t('login.phoneNumber')})"
/>
</el-form-item>
<el-form-item
prop="verifyCode"
>
<el-row>
<el-col :span="16">
<el-input
v-model="resetPasswordForm.verifyCode"
auto-complete="off"
:placeholder="$t('global.pleaseInputBy', {key: $t('login.phoneVerifyCode')})"
prefix-icon="el-icon-key"
style="margin:-right: 10px;"
/>
</el-col>
<el-col :span="8">
<el-button
ref="sendButton"
style="margin-left: 10px;width: 132px;"
:disabled="sending"
@click="handleSendPhoneVerifyCode"
>
{{ sendButtonName }}
</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item
prop="newPassword"
>
<el-input
:key="passwordType"
ref="newPassword"
v-model="resetPasswordForm.newPassword"
prefix-icon="el-icon-lock"
:type="passwordType"
:placeholder="$t('global.pleaseInputBy', {key: $t('login.password')})"
name="newPassword"
tabindex="2"
@keyup.enter.native="handleResetPassword"
/>
<span
class="show-pwd"
@click="showPwd"
>
<svg-icon :name="passwordType === 'password' ? 'eye-off' : 'eye-on'" />
</span>
</el-form-item>
<el-form-item
label-width="100px"
:label="$t('login.existsAccount')"
>
<el-link
type="success"
@click="handleRedirectLogin"
>
{{ $t('login.logIn') }}
</el-link>
</el-form-item>
<el-form-item style="width:100%;">
<el-button
type="primary"
style="width:100%;"
:loading="reseting"
@click="handleResetPassword"
>
{{ $t('login.resetpassword') }}
</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script lang="ts">
import { Input } from 'element-ui'
import { Route } from 'vue-router'
import { Dictionary } from 'vue-router/types/router'
import TenantBox from '@/components/TenantBox/index.vue'
import LangSelect from '@/components/LangSelect/index.vue'
import { Component, Vue, Watch } from 'vue-property-decorator'
import UserService, { PhoneVerify, VerifyType, UserResetPasswordData } from '@/api/users'
import { AbpConfigurationModule } from '@/store/modules/abp'
@Component({
name: 'Register',
components: {
LangSelect,
TenantBox
}
})
export default class extends Vue {
private passwordType = 'password'
private redirect?: string
private sendTimer: any
private sending = false
private sendButtonName = this.l('login.sendVerifyCode')
private reseting = false
private resetPasswordForm = {
tenantName: '',
newPassword: '',
phoneNumber: '',
verifyCode: ''
}
get isMultiEnabled() {
return AbpConfigurationModule.configuration?.multiTenancy?.isEnabled
}
private validatePhoneNumberValue = (rule: any, value: string, callback: any) => {
const phoneReg = /^1[34578]\d{9}$/
if (!value || !phoneReg.test(value)) {
callback(new Error(this.l('global.pleaseInputBy', { key: this.l('global.correctPhoneNumber') })))
} else {
callback()
}
}
private resetPasswordFormRules = {
newPassword: [
{
required: true, message: this.l('global.pleaseInputBy', { key: this.l('login.password') }), trigger: 'blur'
}
],
phoneNumber: [
{
required: true, validator: this.validatePhoneNumberValue, trigger: 'blur'
}
],
verifyCode: [
{
required: true, message: this.l('global.pleaseInputBy', { key: this.l('login.phoneVerifyCode') }), trigger: 'blur'
}
]
}
destroyed() {
if (this.sendTimer) {
clearInterval(this.sendTimer)
}
}
@Watch('$route', { immediate: true })
private onRouteChange(route: Route) {
// TODO: remove the "as Dictionary<string>" hack after v4 release for vue-router
// See https://github.com/vuejs/vue-router/pull/2050 for details
const query = route.query as Dictionary<string>
if (query) {
this.redirect = query.redirect
}
}
private showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
this.$nextTick(() => {
(this.$refs.newPassword as Input).focus()
})
}
private handleRedirectLogin() {
this.$router.replace('login')
}
private handleResetPassword() {
const frmResetPassword = this.$refs.formResetPassword as any
frmResetPassword.validate(async(valid: boolean) => {
if (valid) {
this.reseting = true
try {
const userReserPassword = new UserResetPasswordData()
userReserPassword.phoneNumber = this.resetPasswordForm.phoneNumber
userReserPassword.verifyCode = this.resetPasswordForm.verifyCode
userReserPassword.newPassword = this.resetPasswordForm.newPassword
UserService.resetPassword(userReserPassword).then(() => {
this.handleRedirectLogin()
}).finally(() => {
this.resetLoginButton()
})
} catch {
this.resetLoginButton()
}
}
})
}
private handleSendPhoneVerifyCode() {
const frmResetPassword = this.$refs.formResetPassword as any
frmResetPassword.validateField('phoneNumber', (errorMsg: string) => {
if (!errorMsg) {
this.sending = true
const phoneVerify = new PhoneVerify()
phoneVerify.phoneNumber = this.resetPasswordForm.phoneNumber
phoneVerify.verifyType = VerifyType.ResetPassword
UserService.sendPhoneVerifyCode(phoneVerify).then(() => {
let interValTime = 60
const sendingName = this.l('login.afterSendVerifyCode')
const sendedName = this.l('login.sendVerifyCode')
this.sendTimer = setInterval(() => {
this.sendButtonName = interValTime + sendingName
--interValTime
if (interValTime < 0) {
this.sendButtonName = sendedName
this.sending = false
clearInterval(this.sendTimer)
}
}, 1000)
}).catch(() => {
this.sending = false
})
}
})
}
private l(name: string, values?: any[] | { [key: string]: any }) {
return this.$t(name, values).toString()
}
private resetLoginButton() {
setTimeout(() => {
this.reseting = false
}, 0.5 * 1000)
}
}
</script>
<style lang="scss" scoped>
.login-container {
width: 100%;
height: 100%;
overflow: hidden;
background-color: $loginBg;
.svg-container {
padding: 6px 5px 6px 15px;
color: $darkGray;
vertical-align: middle;
width: 30px;
display: inline-block;
}
.title-container {
position: relative;
.title {
font-size: 26px;
margin: 0px auto 20px auto;
text-align: center;
font-weight: bold;
}
.tips {
font-size: 14px;
color: #fff;
margin-bottom: 10px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
.set-language {
position: absolute;
top: 3px;
font-size: 18px;
right: 0px;
cursor: pointer;
}
}
.show-pwd {
position: absolute;
right: 10px;
font-size: 16px;
color: $darkGray;
cursor: pointer;
user-select: none;
}
}
.login-page {
-webkit-border-radius: 5px;
border-radius: 5px;
margin: 130px auto;
width: 500px;
padding: 35px 35px 15px;
border: 1px solid #8c9494;
box-shadow: 0 0 25px #454646;
background-color:rgb(247, 255, 255);
.loginTab.el-tabs__item {
width: 180px;
}
}
label.el-checkbox.rememberme {
margin: 0px 0px 15px;
text-align: left;
}
</style>
Loading…
Cancel
Save