using YY.Admin.Helper; namespace YY.Admin.ViewModels.Dialogs { public class ServerSettingsDialogViewModel : BindableBase, IDialogAware { private const string DefaultWebSocketPath = "/websocket/scada-sync"; private string _loadedWebSocketUrl = string.Empty; private string _loadedAutoWebSocketUrl = string.Empty; public string Title => "服务器设置"; private string _ip = "127.0.0.1"; public string Ip { get => _ip; set => SetProperty(ref _ip, value); } private int _port = 8080; public int Port { get => _port; set => SetProperty(ref _port, value); } private string _webSocketUrl = string.Empty; public string WebSocketUrl { get => _webSocketUrl; set => SetProperty(ref _webSocketUrl, value); } private string _basePath = "/jeecg-boot"; public string BasePath { get => _basePath; set => SetProperty(ref _basePath, value); } private string _errorMessage = string.Empty; public string ErrorMessage { get => _errorMessage; set => SetProperty(ref _errorMessage, value); } private bool _disconnectConnection; /// /// 是否断开连接(true=断开,false=连接) /// public bool DisconnectConnection { get => _disconnectConnection; set { if (SetProperty(ref _disconnectConnection, value)) { RaisePropertyChanged(nameof(IsConnectionFieldsEnabled)); } } } /// /// 连接参数是否可编辑(勾选断开连接后禁用)。 /// public bool IsConnectionFieldsEnabled => !DisconnectConnection; public DelegateCommand SaveCommand { get; } public DelegateCommand CancelCommand { get; } public DialogCloseListener RequestClose { get; private set; } public ServerSettingsDialogViewModel() { SaveCommand = new DelegateCommand(Save); CancelCommand = new DelegateCommand(() => RequestClose.Invoke(new DialogResult(ButtonResult.Cancel))); } public bool CanCloseDialog() => true; public void OnDialogClosed() { } public void OnDialogOpened(IDialogParameters parameters) { var settings = ServerSettingsStore.Load(); _loadedAutoWebSocketUrl = ServerSettingsStore.BuildDefaultWebSocketUrl(settings.BaseScheme, settings.Ip, settings.Port, settings.BasePath, settings.WebSocketPath); Ip = settings.Ip; Port = settings.Port; WebSocketUrl = string.IsNullOrWhiteSpace(settings.WebSocketUrl) ? _loadedAutoWebSocketUrl : settings.WebSocketUrl; _loadedWebSocketUrl = WebSocketUrl; BasePath = string.IsNullOrWhiteSpace(settings.BasePath) ? "/jeecg-boot" : settings.BasePath; DisconnectConnection = settings.DisconnectConnection; ErrorMessage = string.Empty; } private void Save() { ErrorMessage = string.Empty; if (string.IsNullOrWhiteSpace(Ip)) { ErrorMessage = "IP 不能为空"; return; } if (Port <= 0 || Port > 65535) { ErrorMessage = "端口号必须在 1-65535 之间"; return; } try { var basePath = BasePath?.Trim() ?? "/jeecg-boot"; var shouldAutoRebuildWs = string.IsNullOrWhiteSpace(WebSocketUrl) || string.Equals(WebSocketUrl.Trim(), _loadedAutoWebSocketUrl, StringComparison.OrdinalIgnoreCase) || string.Equals(WebSocketUrl.Trim(), _loadedWebSocketUrl, StringComparison.OrdinalIgnoreCase); var finalWsUrl = shouldAutoRebuildWs ? ServerSettingsStore.BuildDefaultWebSocketUrl("http", Ip.Trim(), Port, basePath, DefaultWebSocketPath) : WebSocketUrl.Trim(); ServerSettingsStore.Save(new ServerSettingsStore.ServerSettingsModel { Ip = Ip.Trim(), Port = Port, BaseScheme = "http", BasePath = basePath, WebSocketUrl = finalWsUrl, WebSocketPath = DefaultWebSocketPath, DisconnectConnection = DisconnectConnection }); RequestClose.Invoke(new DialogResult(ButtonResult.OK)); } catch (Exception ex) { ErrorMessage = $"保存失败:{ex.Message}"; } } } }