diff --git a/frontend/mobile-app/android/gradle.properties b/frontend/mobile-app/android/gradle.properties
index fbee1d8c..c587f726 100644
--- a/frontend/mobile-app/android/gradle.properties
+++ b/frontend/mobile-app/android/gradle.properties
@@ -1,2 +1,2 @@
-org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
+org.gradle.jvmargs=-Xmx1536m -XX:MaxMetaspaceSize=384m -XX:ReservedCodeCacheSize=256m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
diff --git a/frontend/mobile-app/assets/fonts/.gitkeep b/frontend/mobile-app/assets/fonts/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/icons/.gitkeep b/frontend/mobile-app/assets/icons/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/icons/actions/.gitkeep b/frontend/mobile-app/assets/icons/actions/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/icons/nav/.gitkeep b/frontend/mobile-app/assets/icons/nav/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/icons/tokens/.gitkeep b/frontend/mobile-app/assets/icons/tokens/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/images/.gitkeep b/frontend/mobile-app/assets/images/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/images/Overlay-19.svg b/frontend/mobile-app/assets/images/Overlay-19.svg
new file mode 100644
index 00000000..d79816f6
--- /dev/null
+++ b/frontend/mobile-app/assets/images/Overlay-19.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/mobile-app/assets/images/Overlay.svg b/frontend/mobile-app/assets/images/Overlay.svg
new file mode 100644
index 00000000..d0a9e6ba
--- /dev/null
+++ b/frontend/mobile-app/assets/images/Overlay.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/mobile-app/assets/images/Overlay5.svg b/frontend/mobile-app/assets/images/Overlay5.svg
new file mode 100644
index 00000000..e6991bda
--- /dev/null
+++ b/frontend/mobile-app/assets/images/Overlay5.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/mobile-app/assets/images/avatars/.gitkeep b/frontend/mobile-app/assets/images/avatars/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/images/backgrounds/.gitkeep b/frontend/mobile-app/assets/images/backgrounds/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/images/illustrations/.gitkeep b/frontend/mobile-app/assets/images/illustrations/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/images/logo/.gitkeep b/frontend/mobile-app/assets/images/logo/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/assets/lottie/.gitkeep b/frontend/mobile-app/assets/lottie/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/frontend/mobile-app/lib/app.dart b/frontend/mobile-app/lib/app.dart
new file mode 100644
index 00000000..e64ed6d2
--- /dev/null
+++ b/frontend/mobile-app/lib/app.dart
@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'core/theme/app_theme.dart';
+import 'routes/app_router.dart';
+
+class App extends ConsumerWidget {
+ const App({super.key});
+
+ @override
+ Widget build(BuildContext context, WidgetRef ref) {
+ final router = ref.watch(appRouterProvider);
+
+ return ScreenUtilInit(
+ designSize: const Size(375, 812),
+ minTextAdapt: true,
+ splitScreenMode: true,
+ builder: (context, child) {
+ return MaterialApp.router(
+ title: 'RWA榴莲女皇',
+ debugShowCheckedModeBanner: false,
+ theme: AppTheme.light,
+ routerConfig: router,
+ );
+ },
+ );
+ }
+}
diff --git a/frontend/mobile-app/lib/bootstrap.dart b/frontend/mobile-app/lib/bootstrap.dart
new file mode 100644
index 00000000..30987b37
--- /dev/null
+++ b/frontend/mobile-app/lib/bootstrap.dart
@@ -0,0 +1,50 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:hive_flutter/hive_flutter.dart';
+import 'core/storage/local_storage.dart';
+import 'core/di/injection_container.dart';
+import 'core/utils/logger.dart';
+
+Future bootstrap(FutureOr Function() builder) async {
+ // Ensure Flutter bindings are initialized
+ WidgetsFlutterBinding.ensureInitialized();
+
+ // Set preferred orientations
+ await SystemChrome.setPreferredOrientations([
+ DeviceOrientation.portraitUp,
+ DeviceOrientation.portraitDown,
+ ]);
+
+ // Set system UI overlay style
+ SystemChrome.setSystemUIOverlayStyle(
+ const SystemUiOverlayStyle(
+ statusBarColor: Colors.transparent,
+ statusBarIconBrightness: Brightness.dark,
+ systemNavigationBarColor: Colors.white,
+ systemNavigationBarIconBrightness: Brightness.dark,
+ ),
+ );
+
+ // Initialize Hive
+ await Hive.initFlutter();
+
+ // Initialize LocalStorage
+ final localStorage = await LocalStorage.init();
+
+ // Create provider container with initialized dependencies
+ final container = createProviderContainer(localStorage);
+
+ // Run app with error handling
+ FlutterError.onError = (details) {
+ AppLogger.e('Flutter Error', details.exception, details.stack);
+ };
+
+ runApp(
+ UncontrolledProviderScope(
+ container: container,
+ child: await builder(),
+ ),
+ );
+}
diff --git a/frontend/mobile-app/lib/core/constants/api_endpoints.dart b/frontend/mobile-app/lib/core/constants/api_endpoints.dart
new file mode 100644
index 00000000..fbd16674
--- /dev/null
+++ b/frontend/mobile-app/lib/core/constants/api_endpoints.dart
@@ -0,0 +1,65 @@
+class ApiEndpoints {
+ ApiEndpoints._();
+
+ // Base URL
+ static const String baseUrl = 'https://api.rwadurian.com';
+ static const String baseUrlDev = 'https://api-dev.rwadurian.com';
+
+ // Auth
+ static const String auth = '/auth';
+ static const String login = '$auth/login';
+ static const String register = '$auth/register';
+ static const String refreshToken = '$auth/refresh';
+ static const String logout = '$auth/logout';
+
+ // User
+ static const String user = '/user';
+ static const String profile = '$user/profile';
+ static const String updateProfile = '$user/profile/update';
+ static const String updateAvatar = '$user/avatar';
+
+ // Wallet
+ static const String wallet = '/wallet';
+ static const String createWallet = '$wallet/create';
+ static const String importWallet = '$wallet/import';
+ static const String balance = '$wallet/balance';
+
+ // Mining
+ static const String mining = '/mining';
+ static const String miningStatus = '$mining/status';
+ static const String startMining = '$mining/start';
+ static const String stopMining = '$mining/stop';
+ static const String claimReward = '$mining/claim';
+ static const String hashPower = '$mining/hash-power';
+
+ // Ranking
+ static const String ranking = '/ranking';
+ static const String dailyRanking = '$ranking/daily';
+ static const String weeklyRanking = '$ranking/weekly';
+ static const String monthlyRanking = '$ranking/monthly';
+
+ // Trading
+ static const String trading = '/trading';
+ static const String exchange = '$trading/exchange';
+ static const String settlement = '$trading/settlement';
+ static const String transactions = '$trading/transactions';
+
+ // Deposit
+ static const String deposit = '/deposit';
+ static const String depositAddress = '$deposit/address';
+ static const String confirmDeposit = '$deposit/confirm';
+ static const String depositRecords = '$deposit/records';
+
+ // Planting
+ static const String planting = '/planting';
+ static const String plantingPrice = '$planting/price';
+ static const String submitPlanting = '$planting/submit';
+ static const String provinces = '$planting/provinces';
+ static const String cities = '$planting/cities';
+
+ // Community
+ static const String community = '/community';
+ static const String referralList = '$community/referrals';
+ static const String earnings = '$community/earnings';
+ static const String claimEarnings = '$community/claim';
+}
diff --git a/frontend/mobile-app/lib/core/constants/app_constants.dart b/frontend/mobile-app/lib/core/constants/app_constants.dart
new file mode 100644
index 00000000..5ab26f20
--- /dev/null
+++ b/frontend/mobile-app/lib/core/constants/app_constants.dart
@@ -0,0 +1,30 @@
+class AppConstants {
+ AppConstants._();
+
+ // App Info
+ static const String appName = 'RWA榴莲女皇';
+ static const String appVersion = '1.0.0';
+
+ // Animation Durations
+ static const Duration animationFast = Duration(milliseconds: 200);
+ static const Duration animationNormal = Duration(milliseconds: 300);
+ static const Duration animationSlow = Duration(milliseconds: 500);
+
+ // Splash Screen
+ static const Duration splashDuration = Duration(seconds: 2);
+
+ // Pagination
+ static const int pageSize = 20;
+
+ // Timeout
+ static const Duration connectionTimeout = Duration(seconds: 30);
+ static const Duration receiveTimeout = Duration(seconds: 30);
+
+ // Mining
+ static const Duration miningCycleDuration = Duration(hours: 24);
+
+ // Validation
+ static const int mnemonicWordCount = 12;
+ static const int passwordMinLength = 6;
+ static const int passwordMaxLength = 20;
+}
diff --git a/frontend/mobile-app/lib/core/di/injection_container.dart b/frontend/mobile-app/lib/core/di/injection_container.dart
new file mode 100644
index 00000000..25762f77
--- /dev/null
+++ b/frontend/mobile-app/lib/core/di/injection_container.dart
@@ -0,0 +1,21 @@
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import '../storage/secure_storage.dart';
+import '../storage/local_storage.dart';
+
+// Storage Providers
+final secureStorageProvider = Provider((ref) {
+ return SecureStorage();
+});
+
+final localStorageProvider = Provider((ref) {
+ throw UnimplementedError('LocalStorage must be initialized before use');
+});
+
+// Override provider with initialized instance
+ProviderContainer createProviderContainer(LocalStorage localStorage) {
+ return ProviderContainer(
+ overrides: [
+ localStorageProvider.overrideWithValue(localStorage),
+ ],
+ );
+}
diff --git a/frontend/mobile-app/lib/core/errors/error_handler.dart b/frontend/mobile-app/lib/core/errors/error_handler.dart
new file mode 100644
index 00000000..5cc8f6b0
--- /dev/null
+++ b/frontend/mobile-app/lib/core/errors/error_handler.dart
@@ -0,0 +1,72 @@
+import 'package:dio/dio.dart';
+import 'package:logger/logger.dart';
+import 'exceptions.dart';
+import 'failures.dart';
+
+class ErrorHandler {
+ static final Logger _logger = Logger();
+
+ static Failure handleException(dynamic exception) {
+ _logger.e('Error occurred', error: exception);
+
+ if (exception is ServerException) {
+ return ServerFailure(exception.message);
+ } else if (exception is NetworkException) {
+ return NetworkFailure(exception.message);
+ } else if (exception is CacheException) {
+ return CacheFailure(exception.message);
+ } else if (exception is AuthException) {
+ return AuthFailure(exception.message);
+ } else if (exception is WalletException) {
+ return WalletFailure(exception.message);
+ } else if (exception is BlockchainException) {
+ return BlockchainFailure(exception.message);
+ } else if (exception is ValidationException) {
+ return ValidationFailure(exception.message);
+ } else if (exception is StorageException) {
+ return StorageFailure(exception.message);
+ } else if (exception is DioException) {
+ return _handleDioError(exception);
+ } else {
+ return ServerFailure(exception.toString());
+ }
+ }
+
+ static Failure _handleDioError(DioException error) {
+ switch (error.type) {
+ case DioExceptionType.connectionTimeout:
+ case DioExceptionType.sendTimeout:
+ case DioExceptionType.receiveTimeout:
+ return const NetworkFailure('连接超时,请检查网络');
+ case DioExceptionType.connectionError:
+ return const NetworkFailure('网络连接失败');
+ case DioExceptionType.badResponse:
+ return _handleBadResponse(error.response?.statusCode);
+ case DioExceptionType.cancel:
+ return const ServerFailure('请求已取消');
+ default:
+ return const ServerFailure('未知错误');
+ }
+ }
+
+ static Failure _handleBadResponse(int? statusCode) {
+ switch (statusCode) {
+ case 400:
+ return const ServerFailure('请求参数错误');
+ case 401:
+ return const AuthFailure('登录已过期,请重新登录');
+ case 403:
+ return const AuthFailure('没有权限访问');
+ case 404:
+ return const ServerFailure('请求的资源不存在');
+ case 500:
+ return const ServerFailure('服务器内部错误');
+ case 502:
+ return const ServerFailure('服务器网关错误');
+ case 503:
+ return const ServerFailure('服务暂不可用');
+ default:
+ return ServerFailure('服务器错误 ($statusCode)');
+ }
+ }
+}
diff --git a/frontend/mobile-app/lib/core/errors/exceptions.dart b/frontend/mobile-app/lib/core/errors/exceptions.dart
new file mode 100644
index 00000000..30f3705f
--- /dev/null
+++ b/frontend/mobile-app/lib/core/errors/exceptions.dart
@@ -0,0 +1,75 @@
+class ServerException implements Exception {
+ final String message;
+ final int? statusCode;
+
+ const ServerException({
+ this.message = '服务器错误',
+ this.statusCode,
+ });
+
+ @override
+ String toString() => 'ServerException: $message (status: $statusCode)';
+}
+
+class NetworkException implements Exception {
+ final String message;
+
+ const NetworkException([this.message = '网络连接失败']);
+
+ @override
+ String toString() => 'NetworkException: $message';
+}
+
+class CacheException implements Exception {
+ final String message;
+
+ const CacheException([this.message = '缓存错误']);
+
+ @override
+ String toString() => 'CacheException: $message';
+}
+
+class AuthException implements Exception {
+ final String message;
+
+ const AuthException([this.message = '认证失败']);
+
+ @override
+ String toString() => 'AuthException: $message';
+}
+
+class WalletException implements Exception {
+ final String message;
+
+ const WalletException([this.message = '钱包操作失败']);
+
+ @override
+ String toString() => 'WalletException: $message';
+}
+
+class BlockchainException implements Exception {
+ final String message;
+
+ const BlockchainException([this.message = '区块链交互失败']);
+
+ @override
+ String toString() => 'BlockchainException: $message';
+}
+
+class ValidationException implements Exception {
+ final String message;
+
+ const ValidationException([this.message = '验证失败']);
+
+ @override
+ String toString() => 'ValidationException: $message';
+}
+
+class StorageException implements Exception {
+ final String message;
+
+ const StorageException([this.message = '存储操作失败']);
+
+ @override
+ String toString() => 'StorageException: $message';
+}
diff --git a/frontend/mobile-app/lib/core/errors/failures.dart b/frontend/mobile-app/lib/core/errors/failures.dart
new file mode 100644
index 00000000..e746eaf2
--- /dev/null
+++ b/frontend/mobile-app/lib/core/errors/failures.dart
@@ -0,0 +1,41 @@
+import 'package:equatable/equatable.dart';
+
+abstract class Failure extends Equatable {
+ final String message;
+ const Failure(this.message);
+
+ @override
+ List