Skip to content

Commit

Permalink
Merge pull request #94 from yihong1120/feature/dashboard-display
Browse files Browse the repository at this point in the history
Feature/dashboard display
  • Loading branch information
yihong1120 authored Jan 14, 2024
2 parents 3aac44a + 24a1ad5 commit 6c8647c
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 83 deletions.
50 changes: 32 additions & 18 deletions lib/components/navigation_drawer.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';

class CustomNavigationDrawer extends StatelessWidget {
const CustomNavigationDrawer({super.key});
class NavigationDrawer extends StatelessWidget {
const NavigationDrawer({super.key});

@override
Widget build(BuildContext context) {
return Drawer(
Expand All @@ -14,7 +14,7 @@ class CustomNavigationDrawer extends StatelessWidget {
color: Colors.blue,
),
child: Text(
'Navigation Menu',
'菜單',
style: TextStyle(
color: Colors.white,
fontSize: 24,
Expand All @@ -24,32 +24,46 @@ class CustomNavigationDrawer extends StatelessWidget {
ListTile(
leading: const Icon(Icons.home),
title: const Text('Home'),
onTap: () => _navigateTo(context, '/'), // 导航到主页,根据实际路由调整
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/home'); // 更新为正确的路由
},
),
ListTile(
leading: const Icon(Icons.report),
title: const Text('Create Report'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/create'); // 更新为正确的路由
},
),
ListTile(
leading: const Icon(Icons.bar_chart),
title: const Text('Reports'),
onTap: () => _navigateTo(context, '/reports'), // 调整为实际报告页面的路由
leading: const Icon(Icons.edit),
title: const Text('Edit Report'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/reports'); // 更新为正确的路由
},
),
ListTile(
leading: const Icon(Icons.chat),
title: const Text('Chatbot'),
onTap: () => _navigateTo(context, '/chat'), // 调整为实际聊天页面的路由
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/chat'); // 更新为正确的路由
},
),
ListTile(
leading: const Icon(Icons.account_circle),
title: const Text('Accounts'),
onTap: () => _navigateTo(context, '/accounts'), // 调整为实际账户页面的路由
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/accounts'); // 更新为正确的路由
},
),
// 您可以根据需要添加更多的菜单项
],
),
);
}

void _navigateTo(BuildContext context, String route) {
Navigator.pop(context); // 关闭抽屉
if (ModalRoute.of(context)?.settings.name != route) {
Navigator.pushNamed(context, route);
}
}
}
}
15 changes: 9 additions & 6 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import 'package:flutter/material.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:traffic_report_front_flutter/screens/map/home_map.dart';
import 'screens/map/routes.dart' as map_routes;
import 'screens/reports/routes.dart' as reports_routes;
import 'screens/chat/routes.dart' as chat_routes;
import 'screens/accounts/routes.dart' as account_routes;
import 'screens/map/home_map.dart';
import 'components/navigation_drawer.dart' as AppDrawer;

Future main() async {
await dotenv.load(fileName: ".env"); // 加載.env文件
await dotenv.load(fileName: ".env"); // 加载 .env 文件
runApp(const TrafficReportApp());
}

Expand All @@ -22,15 +23,17 @@ class TrafficReportApp extends StatelessWidget {
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),

routes: {
...map_routes.mapRoutes,
...reports_routes.reportsRoutes,
...chat_routes.chatRoutes,
...account_routes.accountsRoutes,
},
// 將 HomeMapPage 設為首頁
home: const HomeMapPage(),
home: Scaffold(
appBar: AppBar(title: const Text('Traffic Report System')),
drawer: const AppDrawer.NavigationDrawer(), // 使用 NavigationDrawer
body: const HomeMapPage(), // 设置 HomeMapPage 作为主体内容
),
);
}
}
128 changes: 70 additions & 58 deletions lib/screens/map/home_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,36 @@ class _HomeMapPageState extends State<HomeMapPage> {

void _loadMarkers() async {
try {
// 指定 API URL
var url = Uri.parse('http://127.0.0.1:8000/api/traffic-violation-markers/');
// 发送请求并等待响应
var response = await http.get(url);

if (response.statusCode == 200) {
// 解析响应数据
List<dynamic> data = json.decode(response.body);

setState(() {
_markers.clear();
for (var markerData in data) {
// 安全地获取数据,并为缺失的字段提供默认值
String licensePlate = markerData['license_plate']?.toString() ?? '未知';
String violation = markerData['violation']?.toString() ?? '未知';
String date = markerData['date']?.toString() ?? '未知';
double lat = markerData['lat'] != null ? markerData['lat'].toDouble() : 0.0;
double lng = markerData['lng'] != null ? markerData['lng'].toDouble() : 0.0;

// 创建标记
final marker = Marker(
markerId: MarkerId(markerData['title'] ?? 'Unknown'), // 使用 'Unknown' 作為後備值
position: LatLng(markerData['lat'], markerData['lng']),
markerId: MarkerId(markerData['traffic_violation_id'].toString()),
position: LatLng(lat, lng),
infoWindow: InfoWindow(
title: markerData['title'] ?? 'Unknown', // 同上
snippet: '點擊查看詳情',
title: '$licensePlate - $violation',
snippet: '车牌号: $licensePlate\n违章: $violation\n日期: $date',
),
onTap: () => _onMarkerTapped(markerData['traffic_violation_id'].toString()),
);
// 将标记添加到地图上
_markers.add(marker);
}
});
Expand All @@ -76,6 +89,56 @@ class _HomeMapPageState extends State<HomeMapPage> {
}
}

void _onMarkerTapped(String trafficViolationId) async {
var url = Uri.parse('http://127.0.0.1:8000/api/traffic-violation-details/$trafficViolationId/');
try {
var response = await http.get(url);
if (response.statusCode == 200) {
// 确保解析为 UTF-8 编码
var decodedData = utf8.decode(response.bodyBytes);
var data = json.decode(decodedData);
// print(data);
setState(() {
var newMarkers = <Marker>{};
for (var marker in _markers) {
if (marker.markerId.value == trafficViolationId) {
String title = '${data['license_plate']?.toString() ?? '未知'} - ${data['violation']?.toString() ?? '未知'}';
String snippet = '车牌号: ${data['license_plate']?.toString() ?? '未知'}\n'
'违章: ${data['violation']?.toString() ?? '未知'}\n'
'日期: ${data['date']?.toString() ?? '未知'}\n'
'时间: ${data['time']?.toString() ?? '未知'}\n'
'地址: ${data['address']?.toString() ?? '未知'}\n'
'官员: ${data['officer']?.toString() ?? '未知'}';


print(snippet);
newMarkers.add(
Marker(
markerId: marker.markerId,
position: marker.position,
infoWindow: InfoWindow(
title: title,
snippet: snippet,
),
onTap: () => _onMarkerTapped(marker.markerId.value), // 保持原有的 onTap 行为
),
);
} else {
newMarkers.add(marker);
}
}

_markers.clear();
_markers.addAll(newMarkers);
});
} else {
logger.e('Failed to load traffic violation details. Status code: ${response.statusCode}');
}
} catch (e) {
logger.e('Error loading traffic violation details: $e');
}
}

void _searchData() async {
// 根據 _searchKeyword 和 _selectedDateRange 進行搜索
// 搜索後的處理可能會涉及與後端的交互
Expand Down Expand Up @@ -128,58 +191,8 @@ class _HomeMapPageState extends State<HomeMapPage> {

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('交通違規報告系統')),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
const DrawerHeader(
decoration: BoxDecoration(
color: Colors.blue,
),
child: Text('菜單'),
),
ListTile(
title: const Text('Home'),
onTap: () {
// 導航到 Home 頁面
Navigator.pop(context);
},
),
ListTile(
title: const Text('Create Report'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/create');
},
),
ListTile(
title: const Text('Edit Report'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/reports');
},
),
ListTile(
title: const Text('Chatbot'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/chat');
},
),
ListTile(
title: const Text('Accounts'),
onTap: () {
Navigator.pop(context);
Navigator.pushNamed(context, '/accounts');
},
),
],
),
),
body: Column(
children: [
return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
Expand Down Expand Up @@ -237,7 +250,6 @@ class _HomeMapPageState extends State<HomeMapPage> {
),
),
],
),
);
);
}
}
7 changes: 6 additions & 1 deletion lib/screens/reports/create_report_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,16 @@ class CreateReportPageState extends State<CreateReportPage> {

@override
void dispose() {
// 一次释放 TextEditingControllers
_dateController.dispose();
_timeController.dispose();

_videoControllers.forEach((_, controller) => controller.dispose());
// 释放 VideoPlayerControllers
for (var controller in _videoControllers.values) {
controller.dispose();
}
_videoControllers.clear();

super.dispose();
}

Expand Down

0 comments on commit 6c8647c

Please sign in to comment.