Skip to content

Commit

Permalink
Merge pull request #27 from NerosoftDev/develop
Browse files Browse the repository at this point in the history
Develop
Codespilot authored Mar 5, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents ea0c0cd + c953706 commit 10b53a8
Showing 47 changed files with 365 additions and 766 deletions.
Original file line number Diff line number Diff line change
@@ -49,6 +49,8 @@ public override void ConfigureServices(ServiceConfigurationContext context)
ConfigureCachingServices(context.Services);

ConfigureBusServices(context.Services);

context.Services.AddHostedService<UserInitializeService>();
}

private void ConfigureCachingServices(IServiceCollection services)

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -6,14 +6,40 @@ namespace Nerosoft.Starfish.Application;
/// <summary>
/// 创建用户命令
/// </summary>
public sealed class UserCreateCommand : Command<UserCreateDto>
public sealed class UserCreateCommand : Command
{
/// <summary>
/// 构造函数
/// 用户名
/// </summary>
/// <param name="data">用户创建数据传输对象</param>
public UserCreateCommand(UserCreateDto data)
: base(data)
{
}
public string UserName { get; set; }

/// <summary>
/// 密码
/// </summary>
public string Password { get; set; }

/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }

/// <summary>
/// 电话
/// </summary>
public string Phone { get; set; }

/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }

/// <summary>
/// 是否是管理员
/// </summary>
public bool IsAdmin { get; set; } = false;

/// <summary>
/// 是否是预留账号
/// </summary>
public bool Reserved { get; set; } = false;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -76,4 +76,11 @@ public interface IUserApplicationService : IApplicationService
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task ResetPasswordAsync(string id, string password, CancellationToken cancellationToken = default);

/// <summary>
/// 初始化用户
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task InitializeAsync(CancellationToken cancellationToken = default);
}

This file was deleted.

16 changes: 11 additions & 5 deletions Source/Starfish.Service/Application/Handlers/UserCommandHandler.cs
Original file line number Diff line number Diff line change
@@ -31,11 +31,13 @@ public Task HandleAsync(UserCreateCommand message, MessageContext context, Cance
return ExecuteAsync(async () =>
{
var business = await Factory.CreateAsync<UserGeneralBusiness>(cancellationToken);
business.UserName = message.Item1.UserName;
business.Password = message.Item1.Password;
business.NickName = message.Item1.NickName;
business.Email = message.Item1.Email;
business.Phone = message.Item1.Phone;
business.UserName = message.UserName;
business.Password = message.Password;
business.NickName = message.NickName;
business.Email = message.Email;
business.Phone = message.Phone;
business.IsAdmin = message.IsAdmin;
business.Reserved = message.Reserved;
business.MarkAsInsert();
await business.SaveAsync(false, cancellationToken);

@@ -52,7 +54,11 @@ public Task HandleAsync(UserUpdateCommand message, MessageContext context, Cance

business.Email = message.Item2.Email;
business.NickName = message.Item2.NickName;
business.Phone = message.Item2.Phone;
business.IsAdmin = message.Item2.IsAdmin;

business.MarkAsUpdate();

await business.SaveAsync(true, cancellationToken);
});
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -72,4 +72,11 @@ public Task ResetPasswordAsync(string id, string password, CancellationToken can
var input = new ResetPasswordInput(id, password);
return useCase.ExecuteAsync(input, cancellationToken);
}

public Task InitializeAsync(CancellationToken cancellationToken = default)
{
var useCase = LazyServiceProvider.GetService<IUserInitializeUseCase>();
return useCase.ExecuteAsync(cancellationToken);
}

}
Original file line number Diff line number Diff line change
@@ -27,9 +27,6 @@ public IdentityMappingProfile()
.ForMember(dest => dest.NickName, options => options.MapFrom(src => src.User.NickName))
.ForMember(dest => dest.Email, options => options.MapFrom(src => src.User.Email))
.ForMember(dest => dest.Phone, options => options.MapFrom(src => src.User.Phone));

CreateMap<Administrator, AdministratorItemDto>();
CreateMap<AdministratorAssignDto, AdministratorAssignCommand>();
}

private static string Mask(string source)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace Nerosoft.Starfish.Application;

internal class UserInitializeService : BackgroundService
{
private readonly IUserApplicationService _service;
private readonly ILogger<UserInitializeService> _logger;

public UserInitializeService(IUserApplicationService service, ILoggerFactory logger)
{
_service = service;
_logger = logger.CreateLogger<UserInitializeService>();
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
await _service.InitializeAsync(stoppingToken);
}
catch (Exception exception)
{
_logger.LogError(exception, exception.Message);
}
}
}
12 changes: 0 additions & 12 deletions Source/Starfish.Service/Domain/Aggregates/Administrator.cs

This file was deleted.

22 changes: 21 additions & 1 deletion Source/Starfish.Service/Domain/Aggregates/User.cs
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ public sealed class User : Aggregate<string>, IHasCreateTime, IHasUpdateTime, IT
private User()
{
}

/// <summary>
/// 初始化用户聚合根
/// </summary>
@@ -77,6 +77,11 @@ private User(string userName, string passwordHash, string passwordSalt)
/// <remarks>预留账号不允许删除、设置角色等</remarks>
public bool Reserved { get; set; }

/// <summary>
/// 是否是管理员
/// </summary>
public bool IsAdmin { get; set; }

/// <summary>
/// 来源
/// </summary>
@@ -155,6 +160,21 @@ internal void SetNickName(string nickName)
NickName = nickName;
}

internal void SetIsAdmin(bool isAdmin)
{
if (Reserved)
{
return;
}

if (isAdmin == IsAdmin)
{
return;
}

IsAdmin = isAdmin;
}

/// <summary>
/// 增加授权失败次数
/// </summary>

This file was deleted.

48 changes: 46 additions & 2 deletions Source/Starfish.Service/Domain/Business/UserGeneralBusiness.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Text.RegularExpressions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Nerosoft.Euonia.Business;
using Nerosoft.Euonia.Domain;
using Nerosoft.Starfish.Service;
@@ -28,6 +29,8 @@ public UserGeneralBusiness(IServiceProvider provider)
public static readonly PropertyInfo<string> NickNameProperty = RegisterProperty<string>(p => p.NickName);
public static readonly PropertyInfo<string> EmailProperty = RegisterProperty<string>(p => p.Email);
public static readonly PropertyInfo<string> PhoneProperty = RegisterProperty<string>(p => p.Phone);
public static readonly PropertyInfo<bool> IsAdminProperty = RegisterProperty<bool>(p => p.IsAdmin);
public static readonly PropertyInfo<bool> ReservedProperty = RegisterProperty<bool>(p => p.Reserved);

public string Id
{
@@ -65,9 +68,21 @@ public string Phone
set => SetProperty(PhoneProperty, value);
}

public bool IsAdmin
{
get => GetProperty(IsAdminProperty);
set => SetProperty(IsAdminProperty, value);
}

public bool Reserved
{
get => GetProperty(ReservedProperty);
set => SetProperty(ReservedProperty, value);
}

protected override void AddRules()
{
Rules.AddRule(new DuplicateUserNameCheckRule());
Rules.AddRule(_provider.GetServiceOrCreateInstance<UserNameAvailabilityCheckRule>());
Rules.AddRule(new DuplicateEmailCheckRule());
Rules.AddRule(new DuplicatePhoneCheckRule());
Rules.AddRule(new PasswordStrengthRule());
@@ -111,6 +126,8 @@ protected override Task InsertAsync(CancellationToken cancellationToken = defaul
}

user.SetNickName(NickName ?? UserName);
user.SetIsAdmin(IsAdmin);
user.Reserved = Reserved;

return Repository.InsertAsync(user, true, cancellationToken)
.ContinueWith(task =>
@@ -123,6 +140,11 @@ protected override Task InsertAsync(CancellationToken cancellationToken = defaul
[FactoryUpdate]
protected override Task UpdateAsync(CancellationToken cancellationToken = default)
{
if (!HasChangedProperties)
{
return Task.CompletedTask;
}

if (ChangedProperties.Contains(EmailProperty))
{
Aggregate.SetEmail(Email);
@@ -143,6 +165,11 @@ protected override Task UpdateAsync(CancellationToken cancellationToken = defaul
Aggregate.ChangePassword(Password);
}

if (ChangedProperties.Contains(IsAdminProperty))
{
Aggregate.SetIsAdmin(IsAdmin);
}

return _repository.UpdateAsync(Aggregate, true, cancellationToken);
}

@@ -157,8 +184,15 @@ protected override Task DeleteAsync(CancellationToken cancellationToken = defaul
return _repository.DeleteAsync(Aggregate, true, cancellationToken);
}

public class DuplicateUserNameCheckRule : RuleBase
public class UserNameAvailabilityCheckRule : RuleBase
{
private readonly IConfiguration _configuration;

public UserNameAvailabilityCheckRule(IConfiguration configuration)
{
_configuration = configuration;
}

public override async Task ExecuteAsync(IRuleContext context, CancellationToken cancellationToken = default)
{
var target = (UserGeneralBusiness)context.Target;
@@ -167,6 +201,16 @@ public override async Task ExecuteAsync(IRuleContext context, CancellationToken
return;
}

if (!target.Reserved)
{
var reserved = _configuration.GetValue<List<string>>("ReservedUsernames");
if (reserved.Contains(target.UserName, StringComparison.OrdinalIgnoreCase))
{
context.AddErrorResult(string.Format(Resources.IDS_ERROR_USER_USERNAME_UNAVAILABLE, target.UserName));
return;
}
}

var repository = target.Repository;
var exists = await repository.CheckUserNameExistsAsync(target.UserName, cancellationToken);
if (exists)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@ internal abstract class AbstractDatabaseModelBuilder : IModelBuilder
public virtual void Configure(ModelBuilder modelBuilder)
{
ConfigureUser(modelBuilder);
ConfigureAdministrator(modelBuilder);
ConfigureTeam(modelBuilder);
ConfigureTeamMember(modelBuilder);
ConfigureConfiguration(modelBuilder);
@@ -20,9 +19,7 @@ public virtual void Configure(ModelBuilder modelBuilder)
}

protected abstract ModelBuilder ConfigureUser(ModelBuilder modelBuilder);

protected abstract ModelBuilder ConfigureAdministrator(ModelBuilder modelBuilder);


protected abstract ModelBuilder ConfigureTeam(ModelBuilder modelBuilder);

protected abstract ModelBuilder ConfigureTeamMember(ModelBuilder modelBuilder);
Original file line number Diff line number Diff line change
@@ -31,28 +31,7 @@ protected override ModelBuilder ConfigureUser(ModelBuilder modelBuilder)
.HasValueGenerator<UuidValueGenerator>();
});
}

protected override ModelBuilder ConfigureAdministrator(ModelBuilder modelBuilder)
{
return modelBuilder.Entity<Administrator>(entity =>
{
entity.ToTable("administrator");

entity.HasKey(t => t.Id);

entity.HasIndex(t => t.UserId).HasDatabaseName("IDX_ADMIN_USER_ID")
.IsUnique();

entity.Property(t => t.Id)
.IsRequired()
.HasValueGenerator<SnowflakeIdValueGenerator>();

entity.HasOne(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId);
});
}


protected override ModelBuilder ConfigureTeam(ModelBuilder modelBuilder)
{
return modelBuilder.Entity<Team>(entity =>

This file was deleted.

This file was deleted.

9 changes: 9 additions & 0 deletions Source/Starfish.Service/Seedwork/ServiceProviderExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Nerosoft.Starfish.Service;

internal static class ServiceProviderExtensions
{
public static T GetServiceOrCreateInstance<T>(this IServiceProvider provider)
{
return ActivatorUtilities.GetServiceOrCreateInstance<T>(provider);
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -41,9 +41,6 @@ public GrantWithPasswordUseCase(IServiceProvider provider)
private IUserRepository _userRepository;
private IUserRepository UserRepository => _userRepository ??= _provider.GetService<IUserRepository>();

private IAdministratorRepository _adminRespository;
private IAdministratorRepository AdminRepository => _adminRespository ??= _provider.GetService<IAdministratorRepository>();

private IdentityCommonComponent _component;
private IdentityCommonComponent Component => _component ??= _provider.GetService<IdentityCommonComponent>();

@@ -79,9 +76,8 @@ public async Task<GrantWithPasswordUseCaseOutput> ExecuteAsync(GrantWithPassword
throw new AuthenticationException(Resources.IDS_ERROR_USER_LOCKOUT);
}

var administrator = await AdminRepository.GetByUserIdAsync(user.Id, cancellationToken);
var roles = administrator?.Roles?.Split(",");

string[] roles = user.IsAdmin ? ["SA"] : [];

var (accessToken, refreshToken, issuesAt, expiresAt) = Component.GenerateAccessToken(user.Id, user.UserName, roles);
@events.Add(new UserAuthSucceedEvent
{
Original file line number Diff line number Diff line change
@@ -43,9 +43,6 @@ public GrantWithRefreshTokenUseCase(IServiceProvider provider)
private IUserRepository UserRepository => _provider.GetService<IUserRepository>();
private ITokenRepository TokenRepository => _provider.GetService<ITokenRepository>();

private IAdministratorRepository _adminRespository;
private IAdministratorRepository AdminRepository => _adminRespository ??= _provider.GetService<IAdministratorRepository>();

private IdentityCommonComponent _component;
private IdentityCommonComponent Component => _component ??= _provider.GetService<IdentityCommonComponent>();

@@ -88,10 +85,9 @@ public async Task<GrantWithRefreshTokenUseCaseOutput> ExecuteAsync(GrantWithRefr
{
throw new AuthenticationException(Resources.IDS_ERROR_USER_LOCKOUT);
}

var administrator = await AdminRepository.GetByUserIdAsync(user.Id, cancellationToken);
var roles = administrator?.Roles?.Split(",");


string[] roles = user.IsAdmin ? ["SA"] : [];

var (accessToken, refreshToken, issuesAt, expiresAt) = Component.GenerateAccessToken(user.Id, user.UserName, roles);
@events.Add(new UserAuthSucceedEvent
{
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Nerosoft.Euonia.Application;
using Nerosoft.Euonia.Bus;
using Nerosoft.Euonia.Mapping;
using Nerosoft.Starfish.Application;
using Nerosoft.Starfish.Transit;

@@ -22,7 +23,7 @@ public UserCreateUseCase(IBus bus)

public Task<UserCreateOutput> ExecuteAsync(UserCreateInput input, CancellationToken cancellationToken = default)
{
var command = new UserCreateCommand(input.Data);
var command = TypeAdapter.ProjectedAs<UserCreateCommand>(input.Data);
return _bus.SendAsync<UserCreateCommand, string>(command, cancellationToken)
.ContinueWith(task => new UserCreateOutput(task.Result), cancellationToken);
}
48 changes: 48 additions & 0 deletions Source/Starfish.Service/UseCases/Identity/UserInitializeUseCase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Microsoft.Extensions.Configuration;
using Nerosoft.Euonia.Application;
using Nerosoft.Euonia.Bus;
using Nerosoft.Starfish.Application;
using Nerosoft.Starfish.Domain;

namespace Nerosoft.Starfish.UseCases;

internal interface IUserInitializeUseCase : IParameterlessUseCase;

internal class UserInitializeUseCase : IUserInitializeUseCase
{
private readonly IBus _bus;
private readonly IUserRepository _repository;
private readonly IConfiguration _configuration;

public UserInitializeUseCase(IBus bus, IUserRepository repository, IConfiguration configuration)
{
_bus = bus;
_repository = repository;
_configuration = configuration;
}

public async Task ExecuteAsync(CancellationToken cancellationToken = default)
{
var username = _configuration["InitializeUser:UserName"];

if (string.IsNullOrWhiteSpace(username))
{
return;
}

var exists = await _repository.CheckUserNameExistsAsync(username, cancellationToken);
if (exists)
{
return;
}

var command = new UserCreateCommand
{
UserName = _configuration["InitializeUser:UserName"],
Password = _configuration["InitializeUser:Password"],
IsAdmin = true,
Reserved = true
};
await _bus.SendAsync<UserCreateCommand, string>(command, cancellationToken).ContinueWith(task => task.WaitAndUnwrapException());
}
}
15 changes: 0 additions & 15 deletions Source/Starfish.Transit/Identity/AdministratorCriteria.cs

This file was deleted.

37 changes: 0 additions & 37 deletions Source/Starfish.Transit/Identity/AdministratorItemDto.cs

This file was deleted.

7 changes: 6 additions & 1 deletion Source/Starfish.Transit/Identity/UserCreateDto.cs
Original file line number Diff line number Diff line change
@@ -24,9 +24,14 @@ public class UserCreateDto
/// 电话
/// </summary>
public string Phone { get; set; }

/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }

/// <summary>
/// 是否是管理员
/// </summary>
public bool IsAdmin { get; set; }
}
5 changes: 5 additions & 0 deletions Source/Starfish.Transit/Identity/UserDetailDto.cs
Original file line number Diff line number Diff line change
@@ -30,6 +30,11 @@ public class UserDetailDto
/// </summary>
public string NickName { get; set; }

/// <summary>
/// 是否管理员
/// </summary>
public bool IsAdmin { get; set; }

/// <summary>
/// 创建时间
/// </summary>
5 changes: 5 additions & 0 deletions Source/Starfish.Transit/Identity/UserItemDto.cs
Original file line number Diff line number Diff line change
@@ -29,4 +29,9 @@ public class UserItemDto
/// 昵称
/// </summary>
public string NickName { get; set; }

/// <summary>
/// 是否管理员
/// </summary>
public bool IsAdmin { get; set; }
}
10 changes: 10 additions & 0 deletions Source/Starfish.Transit/Identity/UserUpdateDto.cs
Original file line number Diff line number Diff line change
@@ -10,8 +10,18 @@ public class UserUpdateDto
/// </summary>
public string Email { get; set; }

/// <summary>
/// 电话号码
/// </summary>
public string Phone { get; set; }

/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }

/// <summary>
/// 是否是管理员
/// </summary>
public bool IsAdmin { get; set; }
}
32 changes: 32 additions & 0 deletions Source/Starfish.Transit/Misc/ConnectionInfoDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
namespace Nerosoft.Starfish.Transit;

/// <summary>
/// 连接信息传输对象
/// </summary>
public class ConnectionInfoDto
{
/// <summary>
/// 配置Id
/// </summary>
public string ConfigurationId { get; set; }

/// <summary>
/// 配置名称
/// </summary>
public string ConfigurationName { get; set; }

/// <summary>
/// 连接Id
/// </summary>
public string ConnectionId { get; set; }

/// <summary>
/// 连接类型
/// </summary>
public string ConnectionType { get; set; }

/// <summary>
/// 连接时间
/// </summary>
public DateTime ConnectedTime { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
namespace Nerosoft.Starfish.Transit;

/// <summary>
/// 管理员编辑数据传输对象
/// 添加团队成员请求Dto
/// </summary>
public class AdministratorAssignDto
public class TeamMemberAppendDto
{
/// <summary>
/// 用户Id
@@ -13,5 +13,5 @@ public class AdministratorAssignDto
/// <summary>
/// 角色
/// </summary>
public List<string> Roles { get; set; }
}
public string Role { get; set; }
}
78 changes: 0 additions & 78 deletions Source/Starfish.Webapi/Controllers/AdministratorController.cs

This file was deleted.

10 changes: 10 additions & 0 deletions Source/Starfish.Webapi/appsettings.json
Original file line number Diff line number Diff line change
@@ -27,6 +27,16 @@
"TopicName": "nerosoft.starfish.topic"
}
},
"InitializeUser": {
"UserName": "admin",
"Password": "Starfish.8888"
},
"ReservedUsernames": [
"starfish",
"admin",
"administrator",
"root"
],
"FeatureManagement": {
"UserRegistration": true
},
49 changes: 33 additions & 16 deletions Source/Starfish.Webapp/Pages/User/Edit.razor
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@

<FluentDialogHeader ShowDismiss="true">
<FluentStack VerticalAlignment="VerticalAlignment.Center">
<FluentIcon Value="@(new Icons.Regular.Size24.People())"/>
<FluentIcon Value="@(new Icons.Regular.Size24.People())" />
<FluentLabel Typo="Typography.PaneHeader">
@Dialog.Instance.Parameters.Title
</FluentLabel>
@@ -16,25 +16,32 @@
<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_USERNAME)"
@bind-Value="UserName"
ReadOnly="@(!string.IsNullOrEmpty(Content))"/>
ReadOnly="@(!string.IsNullOrEmpty(Content))" />
@if (string.IsNullOrEmpty(Content))
{
<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_PASSWORD)"
@bind-Value="Password"
TextFieldType="TextFieldType.Password"/>
TextFieldType="TextFieldType.Password" />
<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_CONFIRM_PASSWORD)"
@bind-Value="Confirm"
TextFieldType="TextFieldType.Password"/>
TextFieldType="TextFieldType.Password" />
}
<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_NICKNAME)"
@bind-Value="NickName"/>
@bind-Value="NickName" />
<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_EMAIL)"
@bind-Value="Email"
TextFieldType="TextFieldType.Email"/>
TextFieldType="TextFieldType.Email" />

<FluentTextField Style="width: 100%"
Label="@(Resources.IDS_USER_LABEL_PHONE)"
@bind-Value="Phone"
TextFieldType="TextFieldType.Tel" />

<FluentSwitch Label="@(Resources.IDS_USER_LABEL_IS_ADMIN)" @bind-Value="IsAdmin" />
</FluentStack>
</FluentDialogBody>

@@ -63,6 +70,10 @@

private string Email { get; set; }

private string Phone { get; set; }

private bool IsAdmin { get; set; }

protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
@@ -77,10 +88,12 @@
if (!string.IsNullOrEmpty(Content))
{
var request = new UserUpdateDto
{
NickName = NickName,
Email = Email
};
{
NickName = NickName,
Email = Email,
Phone = Phone,
IsAdmin = IsAdmin
};

await Api.UpdateAsync(Content, request)
.EnsureSuccess();
@@ -93,12 +106,14 @@
}

var request = new UserCreateDto
{
UserName = UserName,
Password = Password,
NickName = NickName,
Email = Email
};
{
UserName = UserName,
Password = Password,
NickName = NickName,
Email = Email,
Phone = Phone,
IsAdmin = IsAdmin
};

await Api.CreateAsync(request)
.EnsureSuccess();
@@ -140,6 +155,8 @@
UserName = result.UserName;
NickName = result.NickName;
Email = result.Email;
Phone = result.Phone;
IsAdmin = result.IsAdmin;
});
}

23 changes: 12 additions & 11 deletions Source/Starfish.Webapp/Pages/User/Index.razor
Original file line number Diff line number Diff line change
@@ -15,31 +15,32 @@
<FluentGrid>
<FluentGridItem lg="12" sm="12" md="12">
<div class="search-bar">
<FluentSearch Placeholder="@(Resources.IDS_COMMON_PLACEHOLDER_KEYWORD)" @bind-Value="Criteria.Keyword"/>
<FluentSearch Placeholder="@(Resources.IDS_COMMON_PLACEHOLDER_KEYWORD)" @bind-Value="Criteria.Keyword" />
<FluentButton IconStart="@(new Icons.Regular.Size16.Search())" OnClick="@OnSearchClicked">@(Resources.IDS_COMMON_SEARCH)</FluentButton>
<FluentSpacer/>
<FluentSpacer />
<FluentButton IconStart="@(new Icons.Regular.Size16.Add())" Appearance="Appearance.Accent" OnClick="@(() => OnEditClicked(string.Empty))">@(Resources.IDS_USER_BUTTON_TEXT_ADD)</FluentButton>
</div>
</FluentGridItem>
<FluentGridItem lg="12" sm="12" md="12">
<FluentDataGrid ItemsProvider="_provider" Pagination="Pagination" ItemSize="46"
GenerateHeader="GenerateHeaderOption.Sticky" TGridItem="UserItemDto"
GridTemplateColumns="0.5fr 0.5fr 1fr 1fr 0.2fr">
GridTemplateColumns="0.5fr 0.5fr 1fr 1fr 0.4fr 0.2fr">
<TemplateColumn Title="@(Resources.IDS_USER_INDEX_COLUMN_USER_NAME)" Align="@Align.Start">
<FluentButton Appearance="Appearance.Lightweight" OnClick="@(() => OnDetailClicked(context.Id))">@(context.UserName)</FluentButton>
</TemplateColumn>
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_NICK_NAME)" Property="@(c => c.NickName)"/>
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_EMAIL)" Property="@(c => c.Email)"/>
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_PHONE)" Property="@(c => c.Phone)"/>
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_NICK_NAME)" Property="@(c => c.NickName)" />
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_EMAIL)" Property="@(c => c.Email)" />
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_PHONE)" Property="@(c => c.Phone)" />
<PropertyColumn Class="data-grid-column" Title="@(Resources.IDS_USER_INDEX_COLUMN_IS_ADMIN)" Property="@(c => c.IsAdmin ? Resources.IDS_COMMON_YES : Resources.IDS_COMMON_NO)" />
<TemplateColumn Title="@(Resources.IDS_COMMON_COLUMN_ACTIONS)" Align="@Align.Center">
<FluentButton IconEnd="@(new Icons.Regular.Size16.Edit())" OnClick="@(() => OnEditClicked(context.Id))"/>
<FluentButton IconEnd="@(new Icons.Regular.Size16.LockClosedKey())" OnClick="@(() => OnResetPasswordClicked(context.Id))"/>
<FluentButton IconEnd="@(new Icons.Regular.Size16.Edit())" OnClick="@(() => OnEditClicked(context.Id))" />
<FluentButton IconEnd="@(new Icons.Regular.Size16.LockClosedKey())" OnClick="@(() => OnResetPasswordClicked(context.Id))" />
</TemplateColumn>
</FluentDataGrid>
</FluentGridItem>

<FluentGridItem lg="12" sm="12" md="12">
<FluentDataGridPaginator State="@Pagination"/>
<FluentDataGridPaginator State="@Pagination" />
</FluentGridItem>
</FluentGrid>
</FluentCard>
@@ -59,10 +60,10 @@
{
List<UserItemDto> items = null;
var tasks = new List<Task>
{
{
Api.SearchAsync(Criteria, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken)
.EnsureSuccess(result => items = result, request.CancellationToken)
};
};

if (request.StartIndex == 0)
{
9 changes: 9 additions & 0 deletions Source/Starfish.Webapp/Properties/Resources.resx
Original file line number Diff line number Diff line change
@@ -570,6 +570,9 @@
<data name="IDS_USER_INDEX_COLUMN_EMAIL" xml:space="preserve">
<value>Email</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_IS_ADMIN" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_NICK_NAME" xml:space="preserve">
<value>Nick name</value>
</data>
@@ -588,12 +591,18 @@
<data name="IDS_USER_LABEL_EMAIL" xml:space="preserve">
<value>Email</value>
</data>
<data name="IDS_USER_LABEL_IS_ADMIN" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="IDS_USER_LABEL_NICKNAME" xml:space="preserve">
<value>Nick name</value>
</data>
<data name="IDS_USER_LABEL_PASSWORD" xml:space="preserve">
<value>Password</value>
</data>
<data name="IDS_USER_LABEL_PHONE" xml:space="preserve">
<value>Phone number</value>
</data>
<data name="IDS_USER_LABEL_USERNAME" xml:space="preserve">
<value>User name</value>
</data>
9 changes: 9 additions & 0 deletions Source/Starfish.Webapp/Properties/Resources.zh-Hans.resx
Original file line number Diff line number Diff line change
@@ -570,6 +570,9 @@
<data name="IDS_USER_INDEX_COLUMN_EMAIL" xml:space="preserve">
<value>邮箱</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_IS_ADMIN" xml:space="preserve">
<value>管理员</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_NICK_NAME" xml:space="preserve">
<value>昵称</value>
</data>
@@ -588,12 +591,18 @@
<data name="IDS_USER_LABEL_EMAIL" xml:space="preserve">
<value>邮箱</value>
</data>
<data name="IDS_USER_LABEL_IS_ADMIN" xml:space="preserve">
<value>管理员</value>
</data>
<data name="IDS_USER_LABEL_NICKNAME" xml:space="preserve">
<value>昵称</value>
</data>
<data name="IDS_USER_LABEL_PASSWORD" xml:space="preserve">
<value>密码</value>
</data>
<data name="IDS_USER_LABEL_PHONE" xml:space="preserve">
<value>手机号</value>
</data>
<data name="IDS_USER_LABEL_USERNAME" xml:space="preserve">
<value>用户名</value>
</data>
15 changes: 9 additions & 6 deletions Source/Starfish.Webapp/Properties/Resources.zh-Hant.resx
Original file line number Diff line number Diff line change
@@ -345,12 +345,6 @@
<data name="IDS_HOME_COLUMN_CONFIGURATION" xml:space="preserve">
<value>配置</value>
</data>
<data name="IDS_HOME_COLUMN_CONFIGURATION_ID" xml:space="preserve">
<value>配置Id</value>
</data>
<data name="IDS_HOME_COLUMN_CONFIGURATION_NAME" xml:space="preserve">
<value>配置名稱</value>
</data>
<data name="IDS_HOME_COLUMN_CONNECTED_TIME" xml:space="preserve">
<value>連接時間</value>
</data>
@@ -576,6 +570,9 @@
<data name="IDS_USER_INDEX_COLUMN_EMAIL" xml:space="preserve">
<value>電子郵件</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_IS_ADMIN" xml:space="preserve">
<value>管理員</value>
</data>
<data name="IDS_USER_INDEX_COLUMN_NICK_NAME" xml:space="preserve">
<value>昵稱</value>
</data>
@@ -594,12 +591,18 @@
<data name="IDS_USER_LABEL_EMAIL" xml:space="preserve">
<value>電子郵件</value>
</data>
<data name="IDS_USER_LABEL_IS_ADMIN" xml:space="preserve">
<value>管理員</value>
</data>
<data name="IDS_USER_LABEL_NICKNAME" xml:space="preserve">
<value>昵稱</value>
</data>
<data name="IDS_USER_LABEL_PASSWORD" xml:space="preserve">
<value>密碼</value>
</data>
<data name="IDS_USER_LABEL_PHONE" xml:space="preserve">
<value>手機號</value>
</data>
<data name="IDS_USER_LABEL_USERNAME" xml:space="preserve">
<value>用戶名</value>
</data>
19 changes: 0 additions & 19 deletions Source/Starfish.Webapp/Rest/Defines/IAdministratorApi.cs

This file was deleted.

1 change: 0 additions & 1 deletion Source/Starfish.Webapp/Rest/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -39,7 +39,6 @@ public static IServiceCollection AddHttpClientApi(this IServiceCollection servic
.AddTransient(provider => provider.GetRestService<ILogsApi>(HTTP_CLIENT_NAME))
.AddTransient(provider => provider.GetRestService<IUserApi>(HTTP_CLIENT_NAME))
.AddTransient(provider => provider.GetRestService<ITeamApi>(HTTP_CLIENT_NAME))
.AddTransient(provider => provider.GetRestService<IAdministratorApi>(HTTP_CLIENT_NAME))
.AddTransient(provider => provider.GetRestService<IConfigurationApi>(HTTP_CLIENT_NAME))
.AddTransient(provider => provider.GetRestService<IDashboardApi>(HTTP_CLIENT_NAME));

0 comments on commit 10b53a8

Please sign in to comment.