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

Unverified

This user has not yet uploaded their public signing key.
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.