@page "/account/login" @page "/{locale}/account/login" @layout EmptyLayout @inject ILogger Logger @inject IStringLocalizer L @L["login.title"] @if (!dataLoaded) { } else {
@L["login.forgot"] @L["login.register"] @L["login.setdev"]
@L["copyright"] runing as @handler
Quick links: Counter Weather
zh Quick links: Counter Weather
en Quick links: Counter Weather
} @code { string handler = "Server"; [Parameter] public string Locale { get; set; } = string.Empty; [Parameter] [SupplyParameterFromQuery(Name = "ReturnUrl")] public string? ReturnUrl { get; set; } [SupplyParameterFromForm] public LoginModel login { get; set; } = new(); private Form form = null!; bool dataLoaded = false; string message { get; set; } = string.Empty; private bool _isLoading = false; protected override void OnInitialized() { if (OperatingSystem.IsBrowser()) { handler = "Wasm"; } else { handler = "Server"; } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { var authState = await AuthStateProvider.GetAuthenticationStateAsync(); if (authState.User.Identity != null && authState.User.Identity.IsAuthenticated) { Navigation.NavigateTo(ReturnUrl ?? "/"); } } if (!dataLoaded) { dataLoaded = true; StateHasChanged(); } } private async Task LoginAsync() { if (!form.Validate()) return; _isLoading = true; StateHasChanged(); try { var api = "/api/sign/in"; if (!OperatingSystem.IsBrowser()) { // Server 模式:使用浏览器发起的 fetch(通过 JS)并携带 credentials: 'include' var jsResult = await JS.InvokeAsync("ajax.Post", api, login); var result = jsResult.ToJson().FromJson>(); if (result != null && result.Success) { var auth = result.Data; await localStorage.SetItemAsync(StorageKeys.AccessToken, auth.Token); await localStorage.SetItemAsync(StorageKeys.RefreshToken, auth.RefreshToken); if (AuthStateProvider is PersistentAuthenticationStateProvider provider) { provider.UpdateAuthenticationState(auth.Token); } Logger.LogInformation($"登录成功,server 跳转: {ReturnUrl}"); Navigation.NavigateTo(ReturnUrl ?? "/", forceLoad: true); } else { ModalService.Error(new ConfirmOptions() { Title = "提示", Content = result.Message }); } } else { // Wasm 模式:保存 localStorage 并更新 AuthStateProvider var result = await HttpService.Post>(api, login); if (result.Success && result.Data != null) { var auth = result.Data; await localStorage.SetItemAsync(StorageKeys.AccessToken, auth.Token); await localStorage.SetItemAsync(StorageKeys.RefreshToken, auth.RefreshToken); if (AuthStateProvider is PersistentAuthenticationStateProvider provider) { provider.UpdateAuthenticationState(auth.Token); } Logger.LogInformation("登录成功,wasm 跳转: {ReturnUrl}", ReturnUrl); Navigation.NavigateTo(ReturnUrl ?? "/"); } else { ModalService.Error(new ConfirmOptions() { Title = "提示", Content = result.Message }); } } } catch (Exception ex) { Logger.LogError(ex, "登录失败"); ModalService.Error(new ConfirmOptions() { Title = "错误", Content = "登录异常,请稍后重试" }); } finally { _isLoading = false; StateHasChanged(); } } private async Task OnPasswordKeyDown(KeyboardEventArgs value) { if (value.Key == "Enter") { await LoginAsync(); } } void setAccount() { login.Account = "admin"; login.Password = "admin888"; } }