From 146f05388e3a7d3cfcdb997f65ffff3ff3f419a4 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Wed, 15 Apr 2026 11:20:30 +0800 Subject: [PATCH] Support Enter to submit login --- backend/cmd/server/main.go | 1 + frontend/lib/pages/login_page.dart | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index 2498543..cbc8a62 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -24,6 +24,7 @@ func main() { go func() { r := api.SetupRouter(srv) monitor.Infof("API server listening on :8080") + monitor.Infof("Web console listening on :8080/admin") if err := r.Run(":8080"); err != nil { monitor.Errorf("Failed to start API server: %v", err) } diff --git a/frontend/lib/pages/login_page.dart b/frontend/lib/pages/login_page.dart index e49265c..ab1b21b 100644 --- a/frontend/lib/pages/login_page.dart +++ b/frontend/lib/pages/login_page.dart @@ -17,8 +17,17 @@ class LoginPage extends StatefulWidget { class _LoginPageState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); + final _passwordFocusNode = FocusNode(); bool _isLoading = false; + @override + void dispose() { + _usernameController.dispose(); + _passwordController.dispose(); + _passwordFocusNode.dispose(); + super.dispose(); + } + void _handleLogin() async { if (_usernameController.text.isEmpty || _passwordController.text.isEmpty) { ScaffoldMessenger.of( @@ -108,6 +117,8 @@ class _LoginPageState extends State { // Fields TextField( controller: _usernameController, + textInputAction: TextInputAction.next, + onSubmitted: (_) => _passwordFocusNode.requestFocus(), decoration: InputDecoration( labelText: "Username", prefixIcon: Icon(Icons.person), @@ -119,7 +130,14 @@ class _LoginPageState extends State { SizedBox(height: 16), TextField( controller: _passwordController, + focusNode: _passwordFocusNode, obscureText: true, + textInputAction: TextInputAction.done, + onSubmitted: (_) { + if (!_isLoading) { + _handleLogin(); + } + }, decoration: InputDecoration( labelText: "Password", prefixIcon: Icon(Icons.lock),