Browse Source

add login page

liuyuqi-dellpc 1 year ago
parent
commit
1e71481094

+ 1 - 1
.devcontainer/Dockerfile

@@ -1 +1 @@
-FROM jianboy/flutter-dev-container:2.10.5
+FROM jianboy/flutter-dev-container:3.7.7

+ 2 - 2
.github/workflows/build.yml

@@ -1,9 +1,9 @@
 name: CI
 on:
   push:
-    branches: [ master , main]
+    branches: [ master ]
   pull_request:
-    branches: [ master , main]
+    branches: [ master ]
 jobs:
   build:
     strategy:

+ 8 - 0
README.md

@@ -1,5 +1,13 @@
 # flutter_google_map
 
+
+[![Version](https://img.shields.io/badge/version-v1.0.3-brightgreen)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Flutter](https://img.shields.io/badge/Flutter-v3.7.7-brightgreen?style=plastic&logo=Flutter)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Android](https://img.shields.io/badge/Android-33-brightgreen?style=plastic&logo=Android)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Java](https://img.shields.io/badge/Java-11.0.16--amzn-brightgreen?style=plastic&logo=OpenJDK)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Gradle](https://img.shields.io/badge/Gradle-7.2.2-brightgreen?style=plastic&logo=Gradle)](https://git.yoqi.me/lyq/flutter_google_map)
+
+## [English](./README.md) | [中文](./README_ZH.md)
 flutter google map app
 
 ![](https://file.yoqi.me/Developer/Flutter/20230706flutter_google_map/BaiduHi_2023-7-6_18-10-8.jpg)

+ 36 - 0
README_ZH.md

@@ -0,0 +1,36 @@
+# flutter_google_map
+
+
+[![Version](https://img.shields.io/badge/version-v1.0.3-brightgreen)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Flutter](https://img.shields.io/badge/Flutter-v3.7.7-brightgreen?style=plastic&logo=Flutter)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Android](https://img.shields.io/badge/Android-33-brightgreen?style=plastic&logo=Android)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Java](https://img.shields.io/badge/Java-11.0.16--amzn-brightgreen?style=plastic&logo=OpenJDK)](https://git.yoqi.me/lyq/flutter_google_map)
+[![Gradle](https://img.shields.io/badge/Gradle-7.2.2-brightgreen?style=plastic&logo=Gradle)](https://git.yoqi.me/lyq/flutter_google_map)
+
+## [English](./README.md) | [中文](./README_ZH.md)
+flutter google map app
+
+![](https://file.yoqi.me/Developer/Flutter/20230706flutter_google_map/BaiduHi_2023-7-6_18-10-8.jpg)
+
+注意小米等国内线手机,需要安装google 服务框架。
+
+[x] 基础功能:地图浏览,定位,导航
+[] 区域作图
+
+## develop
+
+1,配置key
+
+[google map后台生成key](https://console.cloud.google.com/projectselector2/google/maps-apis/studio/maps?organizationId=0&supportedpurview=project),create a map id, [create a credentials](https://console.cloud.google.com/google/maps-apis/credentials?project=flutte-392306)
+
+web/index.html 配置key, android/app/src/main/AndroidManifest.xml 配置key, ios/Runner/AppDelegate.swift 配置key
+
+2、构建
+```
+flutter build apk
+```
+
+## Reference
+
+* [map-with-marker](https://developers.google.com/maps/flutter-plugin/map-with-marker)
+* [google_maps samples](https://github.com/flutter/samples/blob/main/google_maps)

+ 11 - 0
lib/dao/user_dao.dart

@@ -0,0 +1,11 @@
+import 'package:flutter_google_map/models/user_model.dart';
+
+class UserDao {
+  Future<UserModel> login(String username, String pwd) async {
+    // Get user from database
+    return UserModel.fromJson({
+      "name": "liuyuqi",
+      "userId": 1,
+    });
+  }
+}

+ 5 - 3
lib/main.dart

@@ -1,11 +1,12 @@
 import 'package:flutter/material.dart';
-import 'package:flutter_google_map/pages/index_page.dart';
+import 'package:flutter_google_map/models/config.dart';
+import 'package:flutter_google_map/routes.dart';
 
 /// Description:  enter point
 /// Time       : 07/06/2023 Thursday
 /// Author     : liuyuqi.gov@msn.cn
 void main() {
-  runApp(const MyApp());
+  Config.init(() => runApp(const MyApp()));
 }
 
 class MyApp extends StatelessWidget {
@@ -20,7 +21,8 @@ class MyApp extends StatelessWidget {
       theme: ThemeData(
         primarySwatch: Colors.blue,
       ),
-      home: IndexPage(),
+      initialRoute: Routes.index,
+      onGenerateRoute: Routes.onGenerateRoute,
     );
   }
 }

+ 5 - 0
lib/models/config.dart

@@ -1,3 +1,8 @@
+import 'dart:io';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
 class Config {
     
   static Future init(Function() runApp) async {

+ 14 - 0
lib/models/user_model.dart

@@ -1,4 +1,18 @@
 class UserModel {
   String name = "";
   int userId = 0;
+
+  UserModel({required this.name, required this.userId});
+
+  UserModel.fromJson(Map<String, dynamic> json) {
+    name = json['name'];
+    userId = json['userId'];
+  }
+
+  Map<String, dynamic> toJson() {
+    final Map<String, dynamic> data = <String, dynamic>{};
+    data['name'] = name;
+    data['userId'] = userId;
+    return data;
+  }
 }

+ 84 - 0
lib/pages/login_page.dart

@@ -0,0 +1,84 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_google_map/dao/user_dao.dart';
+import 'package:flutter_google_map/models/user_model.dart';
+
+/// Description: login page
+/// Time       : 07/09/2023 Sunday
+/// Author     : liuyuqi.gov@msn.cn
+class LoginPage extends StatefulWidget {
+  const LoginPage({super.key});
+
+  @override
+  State<LoginPage> createState() => _LoginPageState();
+}
+
+class _LoginPageState extends State<LoginPage> {
+  TextEditingController userNameController = TextEditingController();
+  TextEditingController passwordController = TextEditingController();
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        body: Center(
+      child: SizedBox(
+        width: 400,
+        height: 400,
+        child: Column(
+          children: [
+            TextFormField(
+              controller: userNameController,
+              decoration: const InputDecoration(
+                hintText: "请输入用户名",
+              ),
+              validator: (v) {
+                if (v == null) {
+                  return "用户名不能为空";
+                } else {
+                  return v.trim().isNotEmpty ? null : "用户名不能为空";
+                }
+              },
+            ),
+            TextFormField(
+              controller: passwordController,
+              decoration: const InputDecoration(
+                hintText: "请输入密码",
+              ),
+              obscureText: true,
+              validator: (v) {
+                if (v == null) {
+                  return "密码不能为空";
+                } else {
+                  return v.trim().length > 6 ? null : "密码不能少于6位";
+                }
+              },
+            ),
+            ElevatedButton(
+              onPressed: () {
+                Navigator.of(context).pushNamedAndRemoveUntil(
+                  "/",
+                  (Route<dynamic> route) => false,
+                );
+              },
+              child: const Text("登录"),
+            ),
+          ],
+        ),
+      ),
+    ));
+  }
+
+  void login() async {
+    UserDao userDao = UserDao();
+    // form validate user and pwd then login
+    if (Form.of(context).validate()) {
+      UserModel user =
+          await userDao.login(userNameController.text, passwordController.text);
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        const SnackBar(
+          content: Text("用户名或密码错误"),
+        ),
+      );
+    }
+  }
+}

+ 35 - 0
lib/routes.dart

@@ -0,0 +1,35 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_google_map/pages/index_page.dart';
+import 'package:flutter_google_map/pages/login_page.dart';
+import 'package:flutter_google_map/pages/tabs/home_page.dart';
+
+class Routes {
+  static const String home = "/";
+  static const String index = "/index";
+  static const String login = "/login";
+
+  static MaterialPageRoute<dynamic> onGenerateRoute(RouteSettings settings) {
+    switch (settings.name) {
+      case home:
+        return MaterialPageRoute<dynamic>(
+          builder: (_) => HomePage(),
+        );
+      case index:
+        return MaterialPageRoute<dynamic>(
+          builder: (_) => IndexPage(),
+        );
+      case login:
+        return MaterialPageRoute<dynamic>(
+          builder: (_) => LoginPage(),
+        );
+      default:
+        return MaterialPageRoute<dynamic>(
+          builder: (_) => const Scaffold(
+            body: Center(
+              child: Text("404"),
+            ),
+          ),
+        );
+    }
+  }
+}