1
0

feat: Add user edit feature

This commit is contained in:
Ca2didi 2025-04-21 03:16:10 +08:00
parent e9a986058d
commit 53e99bd291
7 changed files with 79 additions and 3 deletions

View File

@ -32,4 +32,6 @@ public partial class UserModel : ReactiveModel
[Reactive] private DateTime _joinDate; [Reactive] private DateTime _joinDate;
[Reactive] private bool _isAdmin; [Reactive] private bool _isAdmin;
[Reactive] private bool _isActive;
} }

View File

@ -855,6 +855,12 @@ namespace Flawless.Client.Remote
[JsonPropertyName("publicEmail")] [JsonPropertyName("publicEmail")]
public bool? PublicEmail { get; set; } public bool? PublicEmail { get; set; }
[JsonPropertyName("isActive")]
public bool IsActive { get; set; }
[JsonPropertyName("isAdmin")]
public bool IsAdmin { get; set; }
[JsonPropertyName("createdAt")] [JsonPropertyName("createdAt")]
public System.DateTimeOffset? CreatedAt { get; set; } public System.DateTimeOffset? CreatedAt { get; set; }

View File

@ -45,6 +45,9 @@ public partial class UserService : BaseService<UserService>
user.CanEdit = info.Authorized; user.CanEdit = info.Authorized;
user.PhoneNumber = info.Phone; user.PhoneNumber = info.Phone;
user.Email = info.Email; user.Email = info.Email;
user.IsAdmin = info.IsAdmin;
user.IsActive = info.IsActive;
user.JoinDate = info.CreatedAt!.Value.LocalDateTime;
_cachedUsers.Add(username, user); _cachedUsers.Add(username, user);
} }
@ -78,6 +81,9 @@ public partial class UserService : BaseService<UserService>
user.CanEdit = info.Authorized; user.CanEdit = info.Authorized;
user.PhoneNumber = info.Phone; user.PhoneNumber = info.Phone;
user.Email = info.Email; user.Email = info.Email;
user.IsAdmin = info.IsAdmin;
user.IsActive = info.IsActive;
user.JoinDate = info.CreatedAt!.Value.LocalDateTime;
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -306,13 +306,13 @@ public partial class SettingViewModel : RoutableViewModelBase
} }
[ReactiveCommand] [ReactiveCommand]
private async Task ToSuperUserAsync(string username) private async Task PromoteUserAsync(string username)
{ {
await UpdateUserSuperAsync(username, true); await UpdateUserSuperAsync(username, true);
} }
[ReactiveCommand] [ReactiveCommand]
private async Task ToNormalUserAsync(string username) private async Task DemoteUserAsync(string username)
{ {
await UpdateUserSuperAsync(username, false); await UpdateUserSuperAsync(username, false);
} }

View File

@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:u="https://irihi.tech/ursa" xmlns:u="https://irihi.tech/ursa"
xmlns:vm="using:Flawless.Client.ViewModels" xmlns:vm="using:Flawless.Client.ViewModels"
xmlns:views="clr-namespace:Flawless.Client.Views"
x:DataType="vm:SettingViewModel" x:DataType="vm:SettingViewModel"
mc:Ignorable="d" d:DesignWidth="1280" d:DesignHeight="768" mc:Ignorable="d" d:DesignWidth="1280" d:DesignHeight="768"
x:Class="Flawless.Client.Views.SettingView"> x:Class="Flawless.Client.Views.SettingView">
@ -80,6 +81,64 @@
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
<TabItem IsVisible="{Binding LoginUser.IsAdmin}" Header="Users"> <TabItem IsVisible="{Binding LoginUser.IsAdmin}" Header="Users">
<Grid Margin="10">
<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Username" Binding="{Binding Username}" Width="*"/>
<DataGridTextColumn Header="CreateAt" Binding="{Binding JoinDate}" Width="*"/>
<DataGridCheckBoxColumn Header="Active" Binding="{Binding IsActive}" Width="Auto"/>
<DataGridCheckBoxColumn Header="Admin" Binding="{Binding IsAdmin}" Width="Auto"/>
<DataGridTemplateColumn Header="Operations" Width="2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Spacing="4">
<Button Content="Enable"
Command="{Binding $parent[views:SettingView].((vm:SettingViewModel)DataContext).InactivateUserCommand}"
CommandParameter="{Binding Username}"
IsEnabled="{Binding !CanEdit}"
IsVisible="{Binding IsActive}"/>
<Button Content="Disable"
Command="{Binding $parent[views:SettingView].((vm:SettingViewModel)DataContext).ActivateUserCommand}"
CommandParameter="{Binding Username}"
IsEnabled="{Binding !CanEdit}"
IsVisible="{Binding !IsActive}"/>
<Button Content="Promote"
Command="{Binding $parent[views:SettingView].((vm:SettingViewModel)DataContext).PromoteUserCommand}"
CommandParameter="{Binding Username}"
IsEnabled="{Binding !CanEdit}"
IsVisible="{Binding !IsAdmin}"/>
<Button Content="Demote"
Command="{Binding $parent[views:SettingView].((vm:SettingViewModel)DataContext).DemoteUserCommand}"
CommandParameter="{Binding Username}"
IsVisible="{Binding IsAdmin}"
IsEnabled="{Binding !CanEdit}"
Classes="Danger"/>
<Button Content="Delete"
Command="{Binding $parent[views:SettingView].((vm:SettingViewModel)DataContext).DeleteUserCommand}"
CommandParameter="{Binding Username}"
IsEnabled="{Binding !CanEdit}"
Classes="Danger"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!-- 添加用户按钮 -->
<Button Content="添加用户"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Command="{Binding CreateUserCommand}"/>
</Grid>
</TabItem> </TabItem>
<TabItem IsVisible="{Binding LoginUser.IsAdmin}" Header="Logfile"> <TabItem IsVisible="{Binding LoginUser.IsAdmin}" Header="Logfile">
<StackPanel Spacing="8" Orientation="Vertical" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <StackPanel Spacing="8" Orientation="Vertical" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

View File

@ -23,4 +23,6 @@ public record UserInfoResponse
public DateTime? CreatedAt { get; set; } public DateTime? CreatedAt { get; set; }
public bool? IsAdmin { get; set; } public bool? IsAdmin { get; set; }
public bool IsActive { get; set; }
} }

View File

@ -128,7 +128,8 @@ public class UserController(
PublicEmail = authorized ? queryUser.PublicEmail : null, PublicEmail = authorized ? queryUser.PublicEmail : null,
Email = queryUser.PublicEmail || authorized ? queryUser.Email : null, Email = queryUser.PublicEmail || authorized ? queryUser.Email : null,
Phone = authorized ? queryUser.PhoneNumber : null, Phone = authorized ? queryUser.PhoneNumber : null,
IsAdmin = queryUser.Admin IsAdmin = queryUser.Admin,
IsActive = queryUser.LockoutEnabled
}; };
} }
} }