| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:go_router/go_router.dart';
- import '../../shared/widgets/app_scaffold.dart';
- import '../../shared/widgets/nav_bar_config.dart';
- import 'route_observer.dart';
- import '../../features/home/home_page.dart';
- import '../../features/messages/message_list_page.dart';
- import '../../features/profile/profile_page.dart';
- import '../../features/expense/expense_list_page.dart';
- import '../../features/expense/expense_create_page.dart';
- import '../../features/expense/expense_detail_page.dart';
- import '../../features/expense/expense_apply_import_page.dart';
- import '../../features/overtime/overtime_apply_list_page.dart';
- import '../../features/overtime/overtime_apply_create_page.dart';
- import '../../features/overtime/overtime_apply_detail_page.dart';
- import '../../features/overtime/overtime_apply_edit_page.dart';
- import '../../features/vehicle/vehicle_apply_list_page.dart';
- import '../../features/vehicle/vehicle_apply_create_page.dart';
- import '../../features/vehicle/vehicle_apply_detail_page.dart';
- import '../../features/vehicle/vehicle_apply_edit_page.dart';
- import '../../features/outing_log/outing_log_list_page.dart';
- import '../../features/outing_log/outing_log_create_page.dart';
- import '../../features/outing_log/outing_log_detail_page.dart';
- import '../../features/announcement/announcement_list_page.dart';
- import '../../features/announcement/announcement_detail_page.dart';
- import '../../features/announcement/announcement_create_page.dart';
- import '../../features/expense_apply/expense_apply_list_page.dart';
- import '../../features/expense_apply/expense_apply_detail_page.dart';
- import '../../features/expense_apply/expense_apply_create_page.dart';
- import '../../features/expense_apply/expense_apply_edit_page.dart';
- import '../../features/expense/expense_edit_page.dart';
- import '../../features/report/expense_detail_report_page.dart';
- import '../../features/report/overtime_detail_report_page.dart';
- import '../../features/report/vehicle_detail_report_page.dart';
- import '../../features/report/expense_apply_detail_report_page.dart';
- import '../../features/report/outing_log_detail_report_page.dart';
- import '../../features/admin/admin_permissions_page.dart';
- Widget _addButton(BuildContext context, String route) => GestureDetector(
- onTap: () => context.push(route),
- child: const Icon(Icons.add, color: Color(0xFF333333), size: 22),
- );
- void _popToNative() {
- FocusManager.instance.primaryFocus?.unfocus();
- SystemNavigator.pop();
- }
- void _smartBack(BuildContext context) {
- final r = GoRouter.of(context);
- if (r.canPop()) {
- r.pop();
- } else {
- SystemNavigator.pop();
- }
- }
- GoRouter createAppRouter() => GoRouter(
- observers: [routeObserver],
- initialLocation: '/',
- routes: [
- // ── 根 Tab ──
- GoRoute(
- path: '/',
- pageBuilder: (_, _) => const MaterialPage(
- child: AppScaffold(showTabBar: true, body: HomePage()),
- ),
- ),
- GoRoute(
- path: '/messages',
- pageBuilder: (_, _) => const MaterialPage(
- child: AppScaffold(showTabBar: true, body: MessageListPage()),
- ),
- ),
- GoRoute(
- path: '/profile',
- pageBuilder: (_, _) => const MaterialPage(
- child: AppScaffold(showTabBar: true, body: ProfilePage()),
- ),
- ),
- // ── 费用报销 ──
- GoRoute(
- path: '/expense/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/expense/create'),
- onBack: _popToNative,
- ),
- body: const ExpenseListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/expense/import-apply',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const ExpenseApplyImportPage(),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- GoRoute(
- path: '/expense/create',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- canPop: false,
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: ExpenseCreatePage(editId: state.uri.queryParameters['id']),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- GoRoute(
- path: '/expense/detail/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: ExpenseDetailPage(
- billNo: state.pathParameters['billNo']!,
- queryId:
- int.tryParse(state.uri.queryParameters['queryId'] ?? '0') ?? 0,
- ),
- ),
- ),
- ),
- GoRoute(
- path: '/expense/edit/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: ExpenseEditPage(billNo: state.pathParameters['billNo']!),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- // ── 加班 ──
- GoRoute(
- path: '/overtime-apply/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/overtime-apply/create'),
- onBack: _popToNative,
- ),
- body: const OvertimeApplyListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/overtime-apply/create',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: const OvertimeApplyCreatePage(),
- ),
- ),
- ),
- GoRoute(
- path: '/overtime-apply/detail/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: OvertimeApplyDetailPage(
- billNo: state.pathParameters['billNo']!,
- ),
- ),
- ),
- ),
- GoRoute(
- path: '/overtime-apply/edit/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: OvertimeApplyEditPage(billNo: state.pathParameters['billNo']!),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- // ── 用车 ──
- GoRoute(
- path: '/vehicle-apply/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/vehicle-apply/create'),
- onBack: _popToNative,
- ),
- body: const VehicleApplyListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/vehicle-apply/create',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: const VehicleApplyCreatePage(),
- ),
- ),
- ),
- GoRoute(
- path: '/vehicle-apply/detail/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: VehicleApplyDetailPage(billNo: state.pathParameters['billNo']!),
- ),
- ),
- ),
- GoRoute(
- path: '/vehicle-apply/edit/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: VehicleApplyEditPage(billNo: state.pathParameters['billNo']!),
- ),
- ),
- ),
- GoRoute(
- path: '/vehicle-apply/edit/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: VehicleApplyEditPage(billNo: state.pathParameters['billNo']!),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- // ── 外勤日志 ──
- GoRoute(
- path: '/outing-log/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/outing-log/create'),
- onBack: _popToNative,
- ),
- body: const OutingLogListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/outing-log/create',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: const OutingLogCreatePage(),
- ),
- ),
- ),
- GoRoute(
- path: '/outing-log/detail/:id',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: OutingLogDetailPage(id: state.pathParameters['id']!),
- ),
- ),
- ),
- // ── 公告 ──
- GoRoute(
- path: '/announcement/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/announcement/create'),
- onBack: _popToNative,
- ),
- body: const AnnouncementListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/announcement/detail/:id',
- pageBuilder: (context, state) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: AnnouncementDetailPage(id: state.pathParameters['id']!),
- ),
- ),
- ),
- GoRoute(
- path: '/announcement/create',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: const AnnouncementCreatePage(),
- ),
- ),
- ),
- // ── 费用申请 ──
- GoRoute(
- path: '/expense-apply/list',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- showRight: true,
- rightWidget: _addButton(context, '/expense-apply/create'),
- onBack: _popToNative,
- ),
- body: const ExpenseApplyListPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/expense-apply/detail/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: ExpenseApplyDetailPage(
- billNo: state.pathParameters['billNo']!,
- queryId:
- int.tryParse(state.uri.queryParameters['queryId'] ?? '0') ?? 0,
- ),
- ),
- ),
- ),
- GoRoute(
- path: '/expense-apply/create',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- canPop: false,
- child: AppScaffold(
- navConfig: NavBarConfig(showBack: true),
- body: ExpenseApplyCreatePage(id: state.uri.queryParameters['id']),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- GoRoute(
- path: '/expense-apply/edit/:billNo',
- pageBuilder: (context, state) => MaterialPage(
- key: ValueKey(state.uri.toString()),
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: ExpenseApplyEditPage(billNo: state.pathParameters['billNo']!),
- resizeToAvoidBottomInset: false,
- ),
- ),
- ),
- // ── 报表 ──
- GoRoute(
- path: '/report/expense-detail',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const ExpenseDetailReportPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/report/expense-apply-detail',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const ExpenseApplyDetailReportPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/report/overtime-apply-detail',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const OvertimeDetailReportPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/report/vehicle-apply-detail',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const VehicleDetailReportPage(),
- ),
- ),
- ),
- GoRoute(
- path: '/report/outing-log-detail',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const OutingLogDetailReportPage(),
- ),
- ),
- ),
- // ── 管理 ──
- GoRoute(
- path: '/admin/permissions',
- pageBuilder: (context, _) => MaterialPage(
- child: AppScaffold(
- navConfig: NavBarConfig(
- showBack: true,
- onBack: () => _smartBack(context),
- ),
- body: const AdminPermissionsPage(),
- ),
- ),
- ),
- ],
- );
|