Yansen 1 year ago
parent
commit
3ccffd20df

+ 6
- 1
lib/models/app.dart View File

49
       );
49
       );
50
     });
50
     });
51
 
51
 
52
+    var route = Get.routing;
53
+
52
     if (box.read('token') != null) {
54
     if (box.read('token') != null) {
53
       // 尝试获取一次人员信息
55
       // 尝试获取一次人员信息
54
       getCurrent().then((person) {
56
       getCurrent().then((person) {
55
-        user(Person.fromJson(person));
57
+        Person p = Person.fromJson(person);
58
+        user(p);
59
+        box.write("user", p);
56
       }).catchError((e) {
60
       }).catchError((e) {
61
+        box.remove("token");
57
         print(e);
62
         print(e);
58
       });
63
       });
59
     }
64
     }

+ 29
- 21
lib/pages/agreement/index.dart View File

1
 import 'package:farmer_client/widgets/layout/BasicPage.dart';
1
 import 'package:farmer_client/widgets/layout/BasicPage.dart';
2
 import 'package:flutter/material.dart';
2
 import 'package:flutter/material.dart';
3
 import 'package:flutter_screenutil/flutter_screenutil.dart';
3
 import 'package:flutter_screenutil/flutter_screenutil.dart';
4
+import 'package:get/get.dart';
4
 
5
 
5
 class Agreement extends BasicPage {
6
 class Agreement extends BasicPage {
6
   @override
7
   @override
10
       height: 700.h,
11
       height: 700.h,
11
       color: const Color(0xFFFFFFFF),
12
       color: const Color(0xFFFFFFFF),
12
       padding: EdgeInsets.all(15.w),
13
       padding: EdgeInsets.all(15.w),
13
-      child: Column(
14
-        children: [
15
-          Row(
16
-            mainAxisAlignment: MainAxisAlignment.center,
17
-            children: [
18
-              Image(
19
-                  image: const AssetImage('images/icons/decorate.png'),
20
-                  width: 16.5.w),
21
-              Text(
22
-                '用户协议',
23
-                style: TextStyle(
24
-                    fontSize: 20.sp,
25
-                    fontWeight: FontWeight.bold,
26
-                    color: const Color(0xFF222222)),
27
-              ),
28
-              Image(
29
-                  image: const AssetImage('images/icons/decorate.png'),
30
-                  width: 16.5.w),
31
-            ],
32
-          ),
33
-        ],
14
+      child: SingleChildScrollView(
15
+        child: Column(
16
+          children: [
17
+            Row(
18
+              mainAxisAlignment: MainAxisAlignment.center,
19
+              children: [
20
+                Image(
21
+                    image: const AssetImage('images/icons/decorate.png'),
22
+                    width: 16.5.w),
23
+                Text(
24
+                  '用户协议',
25
+                  style: TextStyle(
26
+                      fontSize: 20.sp,
27
+                      fontWeight: FontWeight.bold,
28
+                      color: const Color(0xFF222222)),
29
+                ),
30
+                Image(
31
+                    image: const AssetImage('images/icons/decorate.png'),
32
+                    width: 16.5.w),
33
+              ],
34
+            ),
35
+            Image.network(
36
+              'https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/privacy_policy.png',
37
+              width: Get.width,
38
+              fit: BoxFit.cover,
39
+            )
40
+          ],
41
+        ),
34
       ),
42
       ),
35
     );
43
     );
36
   }
44
   }

+ 2
- 1
lib/pages/home/index.dart View File

24
   Function? Refresh;
24
   Function? Refresh;
25
   List<CardListModel> GetList(value) {
25
   List<CardListModel> GetList(value) {
26
     List<CardListModel> list = [];
26
     List<CardListModel> list = [];
27
-    if (value != null)
27
+    if (value != null) {
28
       value.forEach((item) => {list.add(CardListModel.fromJson(item))});
28
       value.forEach((item) => {list.add(CardListModel.fromJson(item))});
29
+    }
29
     return list;
30
     return list;
30
   }
31
   }
31
 
32
 

+ 5
- 3
lib/pages/login/login.dart View File

1
 import 'dart:async';
1
 import 'dart:async';
2
 import 'package:farmer_client/models/app.dart';
2
 import 'package:farmer_client/models/app.dart';
3
-import 'package:farmer_client/pages/home/index.dart';
4
 import 'package:fluttertoast/fluttertoast.dart';
3
 import 'package:fluttertoast/fluttertoast.dart';
5
 import 'package:flutter/material.dart';
4
 import 'package:flutter/material.dart';
6
 import 'package:flutter_screenutil/flutter_screenutil.dart';
5
 import 'package:flutter_screenutil/flutter_screenutil.dart';
7
 import 'package:get/get.dart';
6
 import 'package:get/get.dart';
7
+import 'package:get_storage/get_storage.dart';
8
 
8
 
9
 import '../../models/entities/person.dart';
9
 import '../../models/entities/person.dart';
10
 import '../../services/user.dart';
10
 import '../../services/user.dart';
40
   int count = 60; //初始倒计时时间
40
   int count = 60; //初始倒计时时间
41
   var timer; //倒计时的计时器
41
   var timer; //倒计时的计时器
42
   TextEditingController mController = TextEditingController();
42
   TextEditingController mController = TextEditingController();
43
+  GetStorage box = GetStorage();
43
 
44
 
44
   //获取验证码
45
   //获取验证码
45
   void _initTimer() {
46
   void _initTimer() {
114
     } else {
115
     } else {
115
       if (_newValue) {
116
       if (_newValue) {
116
         userLogin(handlePhones, handleCodes).then((value) {
117
         userLogin(handlePhones, handleCodes).then((value) {
118
+          box.write("token", value['token']);
119
+          box.write("tokenTimeout", value['tokenTimeout']);
117
           userInfo(Person.fromJson(value['person']));
120
           userInfo(Person.fromJson(value['person']));
118
-
119
           if (widget.isBack) {
121
           if (widget.isBack) {
120
             Get.back();
122
             Get.back();
121
           } else {
123
           } else {
122
-            Get.off(Home());
124
+            Get.offNamed("/home");
123
           }
125
           }
124
         });
126
         });
125
       } else {
127
       } else {

+ 1
- 0
lib/pages/main/widgets/main/index.dart View File

25
         onCancel: () => true,
25
         onCancel: () => true,
26
         onConfirm: () => {
26
         onConfirm: () => {
27
               box.remove('token'),
27
               box.remove('token'),
28
+              box.remove('tokenTimeout'),
28
               Get.offAllNamed('/login'),
29
               Get.offAllNamed('/login'),
29
             });
30
             });
30
   }
31
   }

+ 25
- 50
lib/pages/splash/splash.dart View File

1
-import 'package:farmer_client/pages/splash/widgets/countdown.dart';
1
+import 'package:card_swiper/card_swiper.dart';
2
 import 'package:get/get.dart';
2
 import 'package:get/get.dart';
3
-import 'package:flutter_screenutil/flutter_screenutil.dart';
4
 import 'package:flutter/material.dart';
3
 import 'package:flutter/material.dart';
5
 import 'package:get_storage/get_storage.dart';
4
 import 'package:get_storage/get_storage.dart';
5
+import 'package:farmer_client/utils/tool.dart';
6
 
6
 
7
-class SplashScreen extends StatefulWidget {
7
+class SplashScreen extends StatelessWidget {
8
   const SplashScreen({Key? key}) : super(key: key);
8
   const SplashScreen({Key? key}) : super(key: key);
9
 
9
 
10
-  @override
11
-  State<SplashScreen> createState() => _SplashScreen();
12
-}
13
-
14
-class _SplashScreen extends State<SplashScreen> {
15
-  GetStorage box = GetStorage();
16
-  handleOnFinish() {
17
-    bool isLogin = box.hasData('token');
18
-    if (isLogin) {
19
-      Get.offNamed('/');
20
-    } else {
21
-      Get.offNamed('/login');
22
-    }
23
-  }
24
-
25
   @override
10
   @override
26
   Widget build(BuildContext context) {
11
   Widget build(BuildContext context) {
27
-    return Scaffold(
28
-        body: Container(
29
-      decoration: const BoxDecoration(
30
-        image: DecorationImage(
31
-            image: AssetImage("images/splash.png"),
32
-            fit: BoxFit.cover,
33
-            alignment: Alignment.topCenter),
34
-      ),
35
-      child: Stack(
36
-        children: [
37
-          Positioned(
38
-            right: 15.w,
39
-            top: 50.h,
40
-            child: countdown(3, handleOnFinish),
41
-          ),
42
-          Positioned(
43
-            bottom: 0,
44
-            child: Container(
45
-              width: 375.w,
46
-              height: 60.w,
47
-              child: Center(
48
-                child: Image.asset(
49
-                  'images/logo.png',
50
-                  width: 218.w,
51
-                  height: 50.w,
52
-                ),
53
-              ),
54
-            ),
55
-          ),
56
-        ],
57
-      ),
58
-    ));
12
+    GetStorage box = GetStorage();
13
+    var pg = isLogin() ? '/home' : '/login';
14
+    box.write("not-first-load", true);
15
+
16
+    return Scaffold (
17
+        body: Swiper (
18
+          itemBuilder: (BuildContext context,int index){
19
+            var adImg = "https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/nonghu_launch_image_" + (index + 1).toString() + ".png";
20
+            return Image.network(adImg,fit: BoxFit.fill,);
21
+          },
22
+          loop: false,
23
+          itemCount: 3,
24
+          pagination: const SwiperPagination(),
25
+          // control: SwiperControl(),
26
+          onTap: (index) {
27
+            if (index == 2) {
28
+              Get.offNamed(pg);
29
+            }
30
+            // foo
31
+          },
32
+        )
33
+    );
59
   }
34
   }
60
 }
35
 }

+ 36
- 0
lib/pages/welcome/index.dart View File

1
+
2
+import 'package:card_swiper/card_swiper.dart';
3
+import 'package:flutter/material.dart';
4
+import 'package:get/get.dart';
5
+import 'package:get_storage/get_storage.dart';
6
+
7
+class WelcomePage extends StatelessWidget {
8
+  @override
9
+  Widget build(BuildContext context) {
10
+    GetStorage box = GetStorage();
11
+    var isLogin = box.hasData('token');
12
+    var pg = isLogin ? '/home' : '/login';
13
+
14
+    // box.write("not-first-load", true);
15
+
16
+    return Scaffold (
17
+        body: new Swiper (
18
+          itemBuilder: (BuildContext context,int index){
19
+            var adImg = "https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/nonghu_launch_image_" + (index + 1).toString() + ".png";
20
+            return Image.network(adImg,fit: BoxFit.fill,);
21
+          },
22
+          loop: false,
23
+          itemCount: 3,
24
+          pagination: SwiperPagination(),
25
+          // control: SwiperControl(),
26
+          onTap: (index) {
27
+            if (index == 2) {
28
+              Get.offNamed(pg);
29
+            }
30
+            // foo
31
+          },
32
+        )
33
+    );
34
+  }
35
+  
36
+}

+ 25
- 3
lib/routes/middleWares.dart View File

1
 import 'package:flutter/scheduler.dart';
1
 import 'package:flutter/scheduler.dart';
2
 import 'package:get/get.dart';
2
 import 'package:get/get.dart';
3
 import 'package:get_storage/get_storage.dart';
3
 import 'package:get_storage/get_storage.dart';
4
+import 'package:farmer_client/utils/tool.dart';
5
+
6
+var whiteList = [
7
+  '/',
8
+  '/splash',
9
+  '/login',
10
+  '/agreement',
11
+];
4
 
12
 
5
 void routingCallback(routing) {
13
 void routingCallback(routing) {
6
-  // GetStorage box = GetStorage();
14
+  print("---------routingCallback---------");
15
+  print(routing?.current);
16
+  print(whiteList.contains(routing?.current));
17
+
18
+  if (!isLogin()) {
19
+    if (!whiteList.contains(routing?.current)) {
20
+      print('----will be to login page----->');
21
+
22
+      // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
23
+      // https://github.com/jonataslaw/getx/issues/262
24
+      SchedulerBinding.instance?.addPostFrameCallback((_) => Get.offNamed('/login'));
25
+    }
26
+  }
27
+
28
+
7
   // bool isLogin = box.hasData('token');
29
   // bool isLogin = box.hasData('token');
8
   // bool isSplashScreen = routing?.current == '/splash';
30
   // bool isSplashScreen = routing?.current == '/splash';
9
   // bool isLoginPage = routing?.current == '/login';
31
   // bool isLoginPage = routing?.current == '/login';
10
   // bool isAgreementPage = routing?.current == '/agreement';
32
   // bool isAgreementPage = routing?.current == '/agreement';
11
   // if (!isLogin && !isSplashScreen && !isLoginPage&&!isAgreementPage) {
33
   // if (!isLogin && !isSplashScreen && !isLoginPage&&!isAgreementPage) {
12
-  //   // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
13
-  //   // https://github.com/jonataslaw/getx/issues/262
34
+    // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
35
+    // https://github.com/jonataslaw/getx/issues/262
14
   //   SchedulerBinding.instance?.addPostFrameCallback((_) => Get.offNamed('/login'));
36
   //   SchedulerBinding.instance?.addPostFrameCallback((_) => Get.offNamed('/login'));
15
   // }
37
   // }
16
 }
38
 }

+ 10
- 2
lib/routes/pages.dart View File

1
 import 'package:get/get.dart';
1
 import 'package:get/get.dart';
2
 import 'package:get_storage/get_storage.dart';
2
 import 'package:get_storage/get_storage.dart';
3
+import 'package:farmer_client/utils/tool.dart';
3
 import '../pages/index.dart';
4
 import '../pages/index.dart';
4
 
5
 
5
 List<GetPage> pages = [
6
 List<GetPage> pages = [
7
       name: '/',
8
       name: '/',
8
       page: () {
9
       page: () {
9
         GetStorage box = GetStorage();
10
         GetStorage box = GetStorage();
10
-        return box.hasData('token') ? Home() : MyRouteLogin();
11
+        var isFirstLoad = !box.hasData("not-first-load");
12
+
13
+        print("------isFirstLoad------");
14
+        print(isFirstLoad);
15
+
16
+        return  isFirstLoad ? const SplashScreen() : ( isLogin() ? Home() : MyRouteLogin() );
11
       }),
17
       }),
18
+  GetPage(name: '/home', page: () => Home()),
12
   GetPage(name: '/main', page: () => Main()),
19
   GetPage(name: '/main', page: () => Main()),
13
   GetPage(name: '/order', page: () => OrderPage()),
20
   GetPage(name: '/order', page: () => OrderPage()),
14
   GetPage(name: '/infomation', page: () => Infomation()),
21
   GetPage(name: '/infomation', page: () => Infomation()),
15
   GetPage(name: '/ArticleInfo', page: () => ArticleInfo()), //资讯详情
22
   GetPage(name: '/ArticleInfo', page: () => ArticleInfo()), //资讯详情
16
-  // GetPage(name: '/splash', page: () => SplashScreen()), // SplashScreen
23
+  GetPage(name: '/splash', page: () => SplashScreen()), // SplashScreen
17
   GetPage(name: '/login', page: () => MyRouteLogin()),
24
   GetPage(name: '/login', page: () => MyRouteLogin()),
18
   GetPage(name: '/addressList', page: () => AddressList()),
25
   GetPage(name: '/addressList', page: () => AddressList()),
19
   GetPage(name: '/addAddress', page: () => AddAddress()),
26
   GetPage(name: '/addAddress', page: () => AddAddress()),
26
   GetPage(name: '/orderConfirmation', page: () => OrderConfirmation()),
33
   GetPage(name: '/orderConfirmation', page: () => OrderConfirmation()),
27
   GetPage(name: '/orderPageInfo', page: () => OrderPageInfo()),
34
   GetPage(name: '/orderPageInfo', page: () => OrderPageInfo()),
28
   GetPage(name: '/searchPage', page: () => SearchPage()),
35
   GetPage(name: '/searchPage', page: () => SearchPage()),
36
+  // GetPage(name: '/welcome', page: () => WelcomePage()),
29
 ];
37
 ];

+ 17
- 0
lib/utils/tool.dart View File

1
+
2
+import 'package:get_storage/get_storage.dart';
3
+
4
+bool isLogin() {
5
+  GetStorage box = GetStorage();
6
+
7
+  print('----tokenTimeout----->');
8
+  print(box.read("tokenTimeout"));
9
+
10
+  if (!box.hasData("tokenTimeout")) {
11
+    return false;
12
+  }
13
+
14
+  DateTime expireTime = DateTime.parse(box.read("tokenTimeout"));
15
+  DateTime lastDate = DateTime.now().subtract(const Duration(minutes: 5));
16
+  return expireTime.isAfter(lastDate);
17
+}

+ 4
- 4
lib/widgets/CarsCard.dart View File

34
 
34
 
35
   @override
35
   @override
36
   Widget build(BuildContext context) {
36
   Widget build(BuildContext context) {
37
-    print(widget.item);
37
+    // print(widget.item);
38
 
38
 
39
     return Container(
39
     return Container(
40
       margin: EdgeInsets.fromLTRB(0, 20, 0, 20),
40
       margin: EdgeInsets.fromLTRB(0, 20, 0, 20),
53
               });
53
               });
54
             },
54
             },
55
             child: Image.network(
55
             child: Image.network(
56
-              widget.item.thumb.toString(),
56
+              widget.item.thumb ?? 'https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/no_image.png',
57
               width: 345.w,
57
               width: 345.w,
58
               height: 230.h,
58
               height: 230.h,
59
               fit: BoxFit.cover,
59
               fit: BoxFit.cover,
69
                 Container(
69
                 Container(
70
                   width: 210.w,
70
                   width: 210.w,
71
                   child: Text(
71
                   child: Text(
72
-                    widget.item.name.toString(),
72
+                    widget.item.name ?? '',
73
                     softWrap: true,
73
                     softWrap: true,
74
                     textAlign: TextAlign.left,
74
                     textAlign: TextAlign.left,
75
                     overflow: TextOverflow.ellipsis,
75
                     overflow: TextOverflow.ellipsis,
95
                     child: RichText(
95
                     child: RichText(
96
                       text: TextSpan(children: <InlineSpan>[
96
                       text: TextSpan(children: <InlineSpan>[
97
                         TextSpan(
97
                         TextSpan(
98
-                            text: (widget.item.price! / 100).toString(),
98
+                            text: ((widget.item.price ?? 0) / 100).toString(),
99
                             style: TextStyle(
99
                             style: TextStyle(
100
                               fontSize: 22,
100
                               fontSize: 22,
101
                               fontWeight: FontWeight.bold,
101
                               fontWeight: FontWeight.bold,

+ 1
- 1
lib/widgets/layout/barList.dart View File

6
 final BarList = <BarItem>[
6
 final BarList = <BarItem>[
7
   BarItem(
7
   BarItem(
8
     label: '首页',
8
     label: '首页',
9
-    page: '/',
9
+    page: '/home',
10
     normal: Item(
10
     normal: Item(
11
         color: const Color(0xFF323232),
11
         color: const Color(0xFF323232),
12
         fontSize: 15.sp,
12
         fontSize: 15.sp,

+ 7
- 0
pubspec.lock View File

71
       url: "https://pub.flutter-io.cn"
71
       url: "https://pub.flutter-io.cn"
72
     source: hosted
72
     source: hosted
73
     version: "1.0.0"
73
     version: "1.0.0"
74
+  card_swiper:
75
+    dependency: "direct main"
76
+    description:
77
+      name: card_swiper
78
+      url: "https://pub.flutter-io.cn"
79
+    source: hosted
80
+    version: "3.0.1"
74
   carousel_slider:
81
   carousel_slider:
75
     dependency: "direct main"
82
     dependency: "direct main"
76
     description:
83
     description:

+ 1
- 0
pubspec.yaml View File

54
   flutter_easyrefresh: ^2.2.1 #下拉刷新上拉加载
54
   flutter_easyrefresh: ^2.2.1 #下拉刷新上拉加载
55
   fluwx: ^3.9.0 #微信支付
55
   fluwx: ^3.9.0 #微信支付
56
   tobias: ^2.4.0 #支付宝支付
56
   tobias: ^2.4.0 #支付宝支付
57
+  card_swiper: ^3.0.1
57
 
58
 
58
 #  flutter_bmflocation: ^3.1.0+1
59
 #  flutter_bmflocation: ^3.1.0+1
59
 
60