using FATrace.Model; using FATrace.WPLApp.Core; using FATrace.WPLApp.Services; using FreeSql; using Prism.Commands; using Prism.Services.Dialogs; using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows; namespace FATrace.WPLApp.ViewModels { /// /// 用户新增/编辑 弹窗 VM /// public class DialogUserEditViewModel : DialogViewModel { private readonly IFreeSql _fsql; private readonly ILogService _log; private string _mode = UserManageViewModel.DialogModes.Add; private long _editUserId; public DialogUserEditViewModel(IFreeSql fsql, ILogService log) { _fsql = fsql; _log = log; AccessLevelOptions = new ObservableCollection(new[] { UserManageViewModel.AccessLevels.Admin, UserManageViewModel.AccessLevels.Operator, UserManageViewModel.AccessLevels.Guest }); SaveCommand = new DelegateCommand(async () => await SaveAsync(), () => !IsBusy) .ObservesProperty(() => IsBusy); CancelCommand = new DelegateCommand(() => OnDialogClosed(ButtonResult.Cancel)); } /// /// 等级下拉选项 /// public ObservableCollection AccessLevelOptions { get; } private string? _userName; /// /// 用户名 /// public string? UserName { get => _userName; set { _userName = value; RaisePropertyChanged(); } } private string? _password; /// /// 密码(当前按现有模型使用明文;如后续需哈希,可在保存处替换) /// public string? Password { get => _password; set { _password = value; RaisePropertyChanged(); } } private string? _accessLevel; /// /// 等级 /// public string? AccessLevel { get => _accessLevel; set { _accessLevel = value; RaisePropertyChanged(); } } /// /// 保存 /// public DelegateCommand SaveCommand { get; } /// /// 取消 /// public DelegateCommand CancelCommand { get; } /// /// 打开弹窗时初始化 /// /// 参数 public override void OnDialogOpened(IDialogParameters parameters) { _mode = parameters.GetValue(UserManageViewModel.DialogKeys.Mode) ?? UserManageViewModel.DialogModes.Add; Title = _mode == UserManageViewModel.DialogModes.Edit ? "编辑用户" : "新增用户"; if (_mode == UserManageViewModel.DialogModes.Edit) { _editUserId = parameters.GetValue(UserManageViewModel.DialogKeys.UserId); LoadUser(_editUserId); } else { _editUserId = 0; UserName = string.Empty; Password = string.Empty; AccessLevel = UserManageViewModel.AccessLevels.Operator; } } private void LoadUser(long id) { try { var user = _fsql.Select().Where(a => a.Id == id).First(); if (user == null) { MessageBox.Show("用户不存在或已被删除", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } UserName = user.UserName; Password = user.Password; AccessLevel = user.AccessLevel; } catch (Exception ex) { _log.Error($"加载用户失败: {ex}"); MessageBox.Show($"加载用户失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } private async Task SaveAsync() { if (IsBusy) return; try { if (string.IsNullOrWhiteSpace(UserName)) { MessageBox.Show("请输入用户名", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } if (string.IsNullOrWhiteSpace(Password)) { MessageBox.Show("请输入密码", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } if (string.IsNullOrWhiteSpace(AccessLevel)) { MessageBox.Show("请选择等级", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } IsBusy = true; if (_mode == UserManageViewModel.DialogModes.Add) { await AddAsync(); } else { await UpdateAsync(); } OnDialogClosed(ButtonResult.OK); } catch (Exception ex) { _log.Error($"保存用户失败: {ex}"); MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } finally { IsBusy = false; } } private async Task AddAsync() { await Task.Run(() => { var exists = _fsql.Select().Where(a => a.UserName == UserName).Any(); if (exists) { throw new InvalidOperationException("用户名已存在"); } var entity = new TbUser { UserName = UserName!, Password = Password!, AccessLevel = AccessLevel!, CreateTime = DateTime.Now }; _fsql.Insert(entity).ExecuteAffrows(); }); _log.Info($"新增用户成功: {UserName}"); } private async Task UpdateAsync() { var id = _editUserId; if (id <= 0) throw new InvalidOperationException("编辑用户Id无效"); await Task.Run(() => { var exists = _fsql.Select().Where(a => a.UserName == UserName && a.Id != id).Any(); if (exists) { throw new InvalidOperationException("用户名已存在"); } var aff = _fsql.Update() .Set(a => a.UserName, UserName!) .Set(a => a.Password, Password!) .Set(a => a.AccessLevel, AccessLevel!) .Where(a => a.Id == id) .ExecuteAffrows(); if (aff <= 0) { throw new InvalidOperationException("更新失败:用户不存在或未发生变化"); } }); _log.Info($"更新用户成功: Id={id}, UserName={UserName}"); } } }