import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import '../../../../core/theme/app_colors.dart'; import '../../data/providers/auth_provider.dart'; class LoginPage extends ConsumerStatefulWidget { const LoginPage({super.key}); @override ConsumerState createState() => _LoginPageState(); } class _LoginPageState extends ConsumerState { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); @override Widget build(BuildContext context) { final authState = ref.watch(authStateProvider); return Scaffold( backgroundColor: AppColors.background, body: Center( child: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 48), child: Form( key: _formKey, child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 360), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset( 'assets/icons/logo.svg', width: 96, height: 96, ), const SizedBox(height: 12), const Text( 'iAgent', style: TextStyle( color: AppColors.textPrimary, fontSize: 28, fontWeight: FontWeight.bold, letterSpacing: 2, ), ), const SizedBox(height: 4), const Text( '服务器集群运维智能体', style: TextStyle( color: AppColors.textSecondary, fontSize: 14, ), ), const SizedBox(height: 48), TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: '邮箱', hintText: 'user@example.com', prefixIcon: Icon(Icons.email_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入邮箱地址'; } if (!value.contains('@')) { return '请输入有效的邮箱地址'; } return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: true, decoration: const InputDecoration( labelText: '密码', prefixIcon: Icon(Icons.lock_outline), ), validator: (value) { if (value == null || value.isEmpty) { return '请输入密码'; } return null; }, onFieldSubmitted: (_) => _handleLogin(), ), if (authState.error != null) ...[ const SizedBox(height: 16), Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 8, ), decoration: BoxDecoration( color: AppColors.error.withAlpha(25), borderRadius: BorderRadius.circular(8), ), child: Row( children: [ const Icon(Icons.error_outline, color: AppColors.error, size: 18), const SizedBox(width: 8), Expanded( child: Text( authState.error!, style: const TextStyle( color: AppColors.error, fontSize: 13, ), ), ), ], ), ), ], const SizedBox(height: 24), SizedBox( width: double.infinity, height: 48, child: FilledButton( onPressed: authState.isLoading ? null : _handleLogin, child: authState.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( '登录', style: TextStyle(fontSize: 16), ), ), ), const SizedBox(height: 32), Text( '账号由管理员在后台创建或通过邀请链接注册', style: TextStyle( color: AppColors.textMuted, fontSize: 12, ), textAlign: TextAlign.center, ), ], ), ), ), ), ), ); } Future _handleLogin() async { if (!_formKey.currentState!.validate()) return; final success = await ref.read(authStateProvider.notifier).login( _emailController.text.trim(), _passwordController.text, ); if (success && mounted) { context.go('/dashboard'); } } @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } }