Browse Source

fix:完善免费会员的的状态。

zhoukun 5 months ago
parent
commit
cf18806f7d
34 changed files with 1280 additions and 478 deletions
  1. BIN
      assets/images/icon_member_vip_more.webp
  2. BIN
      assets/images/icon_member_vip_sign.webp
  3. BIN
      assets/images/icon_mine_trial_expiration_bg.webp
  4. BIN
      assets/images/icon_mine_trial_expiration_have.webp
  5. BIN
      assets/images/icon_mine_trial_expiration_header.webp
  6. BIN
      assets/images/icon_mine_trial_expiration_pause_bg.webp
  7. BIN
      assets/images/icon_mine_trial_expiration_question.webp
  8. BIN
      assets/images/icon_mine_trial_expiration_recommend.webp
  9. BIN
      assets/images/icon_mine_trial_expiration_up.webp
  10. BIN
      assets/images/icon_mine_trial_expiration_vip.webp
  11. 3 0
      assets/string/base/string.xml
  12. 6 0
      ios/Podfile.lock
  13. 59 59
      ios/Runner.xcodeproj/project.pbxproj
  14. 11 0
      lib/data/api/atmob_api.dart
  15. 77 0
      lib/data/api/atmob_api.g.dart
  16. 12 0
      lib/data/api/response/member_status_response.dart
  17. 6 0
      lib/data/api/response/member_status_response.g.dart
  18. 23 0
      lib/data/api/response/member_trial_info_response.dart
  19. 21 0
      lib/data/api/response/member_trial_info_response.g.dart
  20. 18 0
      lib/data/bean/member_status_info.dart
  21. 1 1
      lib/data/consts/constants.dart
  22. 5 1
      lib/data/repositories/account_repository.dart
  23. 11 0
      lib/data/repositories/member_repository.dart
  24. 8 0
      lib/data/repositories/track_repository.dart
  25. 10 10
      lib/di/get_it.config.dart
  26. 1 0
      lib/module/main/main_controller.dart
  27. 14 0
      lib/module/mine/mine_controller.dart
  28. 390 0
      lib/module/mine/mine_expiration_reminder_dialog.dart
  29. 97 32
      lib/module/mine/mine_page.dart
  30. 125 0
      lib/module/mine/mine_trial_membership_countdown_text.dart
  31. 11 0
      lib/module/track/track_controller.dart
  32. 50 0
      lib/resource/assets.gen.dart
  33. 109 211
      lib/resource/string.gen.dart
  34. 212 164
      pubspec.lock

BIN
assets/images/icon_member_vip_more.webp


BIN
assets/images/icon_member_vip_sign.webp


BIN
assets/images/icon_mine_trial_expiration_bg.webp


BIN
assets/images/icon_mine_trial_expiration_have.webp


BIN
assets/images/icon_mine_trial_expiration_header.webp


BIN
assets/images/icon_mine_trial_expiration_pause_bg.webp


BIN
assets/images/icon_mine_trial_expiration_question.webp


BIN
assets/images/icon_mine_trial_expiration_recommend.webp


BIN
assets/images/icon_mine_trial_expiration_up.webp


BIN
assets/images/icon_mine_trial_expiration_vip.webp


+ 3 - 0
assets/string/base/string.xml

@@ -59,6 +59,9 @@
     <string name="member_vip_permanent">永久会员</string>
     <string name="member_vip_permanent">永久会员</string>
     <string name="member_experience_vip">免费VIP体验礼包</string>
     <string name="member_experience_vip">免费VIP体验礼包</string>
     <string name="member_experience_vip_receive">去领取</string>
     <string name="member_experience_vip_receive">去领取</string>
+    <string name="member_trial_has_expired">会员试用已过期</string>
+    <string name="member_countdown_remaining">剩余</string>
+    <string name="member_countdown_experience_time">体验时间</string>
 
 
     <string name="mine_urgent_contact">紧急联系人</string>
     <string name="mine_urgent_contact">紧急联系人</string>
     <string name="mine_fun_share">邀请好友</string>
     <string name="mine_fun_share">邀请好友</string>

+ 6 - 0
ios/Podfile.lock

@@ -4,6 +4,8 @@ PODS:
   - apple_pay (0.0.1):
   - apple_pay (0.0.1):
     - Flutter
     - Flutter
   - Bugly (2.6.1)
   - Bugly (2.6.1)
+  - connectivity_plus (0.0.1):
+    - Flutter
   - device_info_plus (0.0.1):
   - device_info_plus (0.0.1):
     - Flutter
     - Flutter
   - Flutter (1.0.0)
   - Flutter (1.0.0)
@@ -56,6 +58,7 @@ PODS:
 DEPENDENCIES:
 DEPENDENCIES:
   - app_tracking_transparency (from `.symlinks/plugins/app_tracking_transparency/ios`)
   - app_tracking_transparency (from `.symlinks/plugins/app_tracking_transparency/ios`)
   - apple_pay (from `.symlinks/plugins/apple_pay/ios`)
   - apple_pay (from `.symlinks/plugins/apple_pay/ios`)
+  - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
   - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
   - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
   - Flutter (from `Flutter`)
   - Flutter (from `Flutter`)
   - flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
   - flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
@@ -84,6 +87,8 @@ EXTERNAL SOURCES:
     :path: ".symlinks/plugins/app_tracking_transparency/ios"
     :path: ".symlinks/plugins/app_tracking_transparency/ios"
   apple_pay:
   apple_pay:
     :path: ".symlinks/plugins/apple_pay/ios"
     :path: ".symlinks/plugins/apple_pay/ios"
+  connectivity_plus:
+    :path: ".symlinks/plugins/connectivity_plus/ios"
   device_info_plus:
   device_info_plus:
     :path: ".symlinks/plugins/device_info_plus/ios"
     :path: ".symlinks/plugins/device_info_plus/ios"
   Flutter:
   Flutter:
@@ -119,6 +124,7 @@ SPEC CHECKSUMS:
   app_tracking_transparency: 3d84f147f67ca82d3c15355c36b1fa6b66ca7c92
   app_tracking_transparency: 3d84f147f67ca82d3c15355c36b1fa6b66ca7c92
   apple_pay: ac72506ba3433c28436ddbedcbea2454c788ddb3
   apple_pay: ac72506ba3433c28436ddbedcbea2454c788ddb3
   Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31
   Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31
+  connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
   device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896
   device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896
   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
   flutter_bugly: a77131ff7b385a481c594830dc89aa53e8e7fbee
   flutter_bugly: a77131ff7b385a481c594830dc89aa53e8e7fbee

+ 59 - 59
ios/Runner.xcodeproj/project.pbxproj

@@ -8,14 +8,14 @@
 
 
 /* Begin PBXBuildFile section */
 /* Begin PBXBuildFile section */
 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+		27E46E907725369734A7EE68 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */; };
 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
-		962A9F3817B9BAF7FA6D2CD6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAF341259CBC571391BFADE6 /* Pods_RunnerTests.framework */; };
+		85DDAD4C1F713879496C06E0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */; };
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
-		B7367A3755B0F6CEBFE163F0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F10D8DDF208CE1F482241100 /* Pods_Runner.framework */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
 /* Begin PBXContainerItemProxy section */
 /* Begin PBXContainerItemProxy section */
@@ -42,20 +42,21 @@
 /* End PBXCopyFilesBuildPhase section */
 /* End PBXCopyFilesBuildPhase section */
 
 
 /* Begin PBXFileReference section */
 /* Begin PBXFileReference section */
+		0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
-		2421231958196E74A2FC2898 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
-		2A8F43785C8181666617EB54 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+		1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
+		1D9BAB2ACD05F4E34704A073 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
+		1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
 		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
 		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
 		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
-		3F9ACC92135A990B749F6BB9 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
 		58C6B4992DDB237C00B7D33B /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
 		58C6B4992DDB237C00B7D33B /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
-		70AE383925BFB0F9C3EFA524 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
-		79FFF24F73C7DABF347943F6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
+		8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
+		92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -63,9 +64,8 @@
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		C0A93C5E63FE491A9041A9EB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
-		F10D8DDF208CE1F482241100 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		FAF341259CBC571391BFADE6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		A97B5AE46C1D16447C700518 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+		AA7B5387E0D23F4C81F57252 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
@@ -73,7 +73,7 @@
 			isa = PBXFrameworksBuildPhase;
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				962A9F3817B9BAF7FA6D2CD6 /* Pods_RunnerTests.framework in Frameworks */,
+				85DDAD4C1F713879496C06E0 /* Pods_RunnerTests.framework in Frameworks */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -81,7 +81,7 @@
 			isa = PBXFrameworksBuildPhase;
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				B7367A3755B0F6CEBFE163F0 /* Pods_Runner.framework in Frameworks */,
+				27E46E907725369734A7EE68 /* Pods_Runner.framework in Frameworks */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -91,12 +91,12 @@
 		16DCD684832953174E92ED56 /* Pods */ = {
 		16DCD684832953174E92ED56 /* Pods */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				2A8F43785C8181666617EB54 /* Pods-Runner.debug.xcconfig */,
-				C0A93C5E63FE491A9041A9EB /* Pods-Runner.release.xcconfig */,
-				79FFF24F73C7DABF347943F6 /* Pods-Runner.profile.xcconfig */,
-				70AE383925BFB0F9C3EFA524 /* Pods-RunnerTests.debug.xcconfig */,
-				3F9ACC92135A990B749F6BB9 /* Pods-RunnerTests.release.xcconfig */,
-				2421231958196E74A2FC2898 /* Pods-RunnerTests.profile.xcconfig */,
+				A97B5AE46C1D16447C700518 /* Pods-Runner.debug.xcconfig */,
+				AA7B5387E0D23F4C81F57252 /* Pods-Runner.release.xcconfig */,
+				1D9BAB2ACD05F4E34704A073 /* Pods-Runner.profile.xcconfig */,
+				1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */,
+				1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */,
+				8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */,
 			);
 			);
 			path = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -109,11 +109,11 @@
 			path = RunnerTests;
 			path = RunnerTests;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		4E093DEA8C1173E1D74802CF /* Frameworks */ = {
+		6520DE7C2A6C7ADBEE742B07 /* Frameworks */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				F10D8DDF208CE1F482241100 /* Pods_Runner.framework */,
-				FAF341259CBC571391BFADE6 /* Pods_RunnerTests.framework */,
+				92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */,
+				0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */,
 			);
 			);
 			name = Frameworks;
 			name = Frameworks;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -137,7 +137,7 @@
 				97C146EF1CF9000F007C117D /* Products */,
 				97C146EF1CF9000F007C117D /* Products */,
 				331C8082294A63A400263BE5 /* RunnerTests */,
 				331C8082294A63A400263BE5 /* RunnerTests */,
 				16DCD684832953174E92ED56 /* Pods */,
 				16DCD684832953174E92ED56 /* Pods */,
-				4E093DEA8C1173E1D74802CF /* Frameworks */,
+				6520DE7C2A6C7ADBEE742B07 /* Frameworks */,
 			);
 			);
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -173,7 +173,7 @@
 			isa = PBXNativeTarget;
 			isa = PBXNativeTarget;
 			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
 			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
 			buildPhases = (
 			buildPhases = (
-				F01F5DDAEAB517E7A4FB4826 /* [CP] Check Pods Manifest.lock */,
+				E9579EDFD1CEA45AEC51FB36 /* [CP] Check Pods Manifest.lock */,
 				331C807D294A63A400263BE5 /* Sources */,
 				331C807D294A63A400263BE5 /* Sources */,
 				331C807F294A63A400263BE5 /* Resources */,
 				331C807F294A63A400263BE5 /* Resources */,
 				7ACCDC8B09D672B8F500CBE3 /* Frameworks */,
 				7ACCDC8B09D672B8F500CBE3 /* Frameworks */,
@@ -192,15 +192,15 @@
 			isa = PBXNativeTarget;
 			isa = PBXNativeTarget;
 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
 			buildPhases = (
 			buildPhases = (
-				5729C05D301E2877F838CDDE /* [CP] Check Pods Manifest.lock */,
+				B14DFDA38AC31F8F2B22E107 /* [CP] Check Pods Manifest.lock */,
 				9740EEB61CF901F6004384FC /* Run Script */,
 				9740EEB61CF901F6004384FC /* Run Script */,
 				97C146EA1CF9000F007C117D /* Sources */,
 				97C146EA1CF9000F007C117D /* Sources */,
 				97C146EB1CF9000F007C117D /* Frameworks */,
 				97C146EB1CF9000F007C117D /* Frameworks */,
 				97C146EC1CF9000F007C117D /* Resources */,
 				97C146EC1CF9000F007C117D /* Resources */,
 				9705A1C41CF9048500538489 /* Embed Frameworks */,
 				9705A1C41CF9048500538489 /* Embed Frameworks */,
 				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
 				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
-				7B946CA3088B384B0CC5B9D1 /* [CP] Embed Pods Frameworks */,
-				5C0FE92CDC29E6656D241B62 /* [CP] Copy Pods Resources */,
+				62A200EC4C96F3CED7A67E38 /* [CP] Embed Pods Frameworks */,
+				C857831E004A50F7D4270CF0 /* [CP] Copy Pods Resources */,
 			);
 			);
 			buildRules = (
 			buildRules = (
 			);
 			);
@@ -288,78 +288,78 @@
 			shellPath = /bin/sh;
 			shellPath = /bin/sh;
 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
 		};
 		};
-		5729C05D301E2877F838CDDE /* [CP] Check Pods Manifest.lock */ = {
+		62A200EC4C96F3CED7A67E38 /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
 			inputFileListPaths = (
 			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
 			);
-			inputPaths = (
-				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
-				"${PODS_ROOT}/Manifest.lock",
-			);
-			name = "[CP] Check Pods Manifest.lock";
+			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
 			outputFileListPaths = (
-			);
-			outputPaths = (
-				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 			showEnvVarsInLog = 0;
 		};
 		};
-		5C0FE92CDC29E6656D241B62 /* [CP] Copy Pods Resources */ = {
+		9740EEB61CF901F6004384FC /* Run Script */ = {
 			isa = PBXShellScriptBuildPhase;
 			isa = PBXShellScriptBuildPhase;
+			alwaysOutOfDate = 1;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
-			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+			inputPaths = (
 			);
 			);
-			name = "[CP] Copy Pods Resources";
-			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+			name = "Run Script";
+			outputPaths = (
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
-			showEnvVarsInLog = 0;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
 		};
 		};
-		7B946CA3088B384B0CC5B9D1 /* [CP] Embed Pods Frameworks */ = {
+		B14DFDA38AC31F8F2B22E107 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
 			inputFileListPaths = (
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
 			);
-			name = "[CP] Embed Pods Frameworks";
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
 			outputFileListPaths = (
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 			showEnvVarsInLog = 0;
 		};
 		};
-		9740EEB61CF901F6004384FC /* Run Script */ = {
+		C857831E004A50F7D4270CF0 /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			isa = PBXShellScriptBuildPhase;
-			alwaysOutOfDate = 1;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
-			inputPaths = (
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
 			);
 			);
-			name = "Run Script";
-			outputPaths = (
+			name = "[CP] Copy Pods Resources";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellPath = /bin/sh;
-			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+			showEnvVarsInLog = 0;
 		};
 		};
-		F01F5DDAEAB517E7A4FB4826 /* [CP] Check Pods Manifest.lock */ = {
+		E9579EDFD1CEA45AEC51FB36 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
@@ -514,7 +514,7 @@
 		};
 		};
 		331C8088294A63A400263BE5 /* Debug */ = {
 		331C8088294A63A400263BE5 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 70AE383925BFB0F9C3EFA524 /* Pods-RunnerTests.debug.xcconfig */;
+			baseConfigurationReference = 1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
@@ -532,7 +532,7 @@
 		};
 		};
 		331C8089294A63A400263BE5 /* Release */ = {
 		331C8089294A63A400263BE5 /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 3F9ACC92135A990B749F6BB9 /* Pods-RunnerTests.release.xcconfig */;
+			baseConfigurationReference = 1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
@@ -548,7 +548,7 @@
 		};
 		};
 		331C808A294A63A400263BE5 /* Profile */ = {
 		331C808A294A63A400263BE5 /* Profile */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 2421231958196E74A2FC2898 /* Pods-RunnerTests.profile.xcconfig */;
+			baseConfigurationReference = 8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;

+ 11 - 0
lib/data/api/atmob_api.dart

@@ -1,3 +1,5 @@
+import 'dart:convert';
+
 import 'package:dio/dio.dart';
 import 'package:dio/dio.dart';
 import 'package:location/base/app_base_request.dart';
 import 'package:location/base/app_base_request.dart';
 import 'package:location/base/base_response.dart';
 import 'package:location/base/base_response.dart';
@@ -25,6 +27,7 @@ import 'package:location/data/api/response/friends_list_response.dart';
 import 'package:location/data/api/response/item_list_response.dart';
 import 'package:location/data/api/response/item_list_response.dart';
 import 'package:location/data/api/response/login_response.dart';
 import 'package:location/data/api/response/login_response.dart';
 import 'package:location/data/api/response/member_status_response.dart';
 import 'package:location/data/api/response/member_status_response.dart';
+import 'package:location/data/api/response/member_trial_info_response.dart';
 import 'package:location/data/api/response/member_trial_response.dart';
 import 'package:location/data/api/response/member_trial_response.dart';
 import 'package:location/data/api/response/message_response.dart';
 import 'package:location/data/api/response/message_response.dart';
 import 'package:location/data/api/response/order_status_response.dart';
 import 'package:location/data/api/response/order_status_response.dart';
@@ -171,4 +174,12 @@ abstract class AtmobApi {
   ///恢复订阅
   ///恢复订阅
   @POST("/s/v1/subscription/resume")
   @POST("/s/v1/subscription/resume")
   Future<BaseResponse> subscriptionresume(@Body() SubscriptionResumeRequest request);
   Future<BaseResponse> subscriptionresume(@Body() SubscriptionResumeRequest request);
+
+  ///试用结束查看试用信息-
+  @POST("/s/v1/member/trial/info")
+  Future<BaseResponse <MemberTrialInfoResponse>> memberTrailInfo(@Body() AppBaseRequest request);
+
+  ///试用期间上报查看轨迹次数-
+  @POST("/s/v1/member/trial/track")
+  Future<BaseResponse> memberTrailTrack(@Body() AppBaseRequest request);
 }
 }

+ 77 - 0
lib/data/api/atmob_api.g.dart

@@ -1318,6 +1318,83 @@ class _AtmobApi implements AtmobApi {
     return _value;
     return _value;
   }
   }
 
 
+  @override
+  Future<BaseResponse<MemberTrialInfoResponse>> memberTrailInfo(
+      AppBaseRequest request) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options =
+        _setStreamType<BaseResponse<MemberTrialInfoResponse>>(Options(
+      method: 'POST',
+      headers: _headers,
+      extra: _extra,
+    )
+            .compose(
+              _dio.options,
+              '/s/v1/member/trial/info',
+              queryParameters: queryParameters,
+              data: _data,
+            )
+            .copyWith(
+                baseUrl: _combineBaseUrls(
+              _dio.options.baseUrl,
+              baseUrl,
+            )));
+    final _result = await _dio.fetch<Map<String, dynamic>>(_options);
+    late BaseResponse<MemberTrialInfoResponse> _value;
+    try {
+      _value = BaseResponse<MemberTrialInfoResponse>.fromJson(
+        _result.data!,
+        (json) =>
+            MemberTrialInfoResponse.fromJson(json as Map<String, dynamic>),
+      );
+    } on Object catch (e, s) {
+      errorLogger?.logError(e, s, _options);
+      rethrow;
+    }
+    return _value;
+  }
+
+  @override
+  Future<BaseResponse<dynamic>> memberTrailTrack(AppBaseRequest request) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options = _setStreamType<BaseResponse<dynamic>>(Options(
+      method: 'POST',
+      headers: _headers,
+      extra: _extra,
+    )
+        .compose(
+          _dio.options,
+          '/s/v1/member/trial/track',
+          queryParameters: queryParameters,
+          data: _data,
+        )
+        .copyWith(
+            baseUrl: _combineBaseUrls(
+          _dio.options.baseUrl,
+          baseUrl,
+        )));
+    final _result = await _dio.fetch<Map<String, dynamic>>(_options);
+    late BaseResponse<dynamic> _value;
+    try {
+      _value = BaseResponse<dynamic>.fromJson(
+        _result.data!,
+        (json) => json as dynamic,
+      );
+    } on Object catch (e, s) {
+      errorLogger?.logError(e, s, _options);
+      rethrow;
+    }
+    return _value;
+  }
+
   RequestOptions newRequestOptions(Object? options) {
   RequestOptions newRequestOptions(Object? options) {
     if (options is RequestOptions) {
     if (options is RequestOptions) {
       return options as RequestOptions;
       return options as RequestOptions;

+ 12 - 0
lib/data/api/response/member_status_response.dart

@@ -28,6 +28,15 @@ class MemberStatusResponse {
   @JsonKey(name: 'deviceId')
   @JsonKey(name: 'deviceId')
   final String deviceId;
   final String deviceId;
 
 
+  @JsonKey(name: 'trialed')
+  final bool? trialed;
+
+  @JsonKey(name: 'avatar')
+  final String? avatar;
+
+  @JsonKey(name: 'trialEndTimestamp')
+  final int? trialEndTimestamp;
+
   MemberStatusResponse({
   MemberStatusResponse({
     required this.userId,
     required this.userId,
     required this.level,
     required this.level,
@@ -37,6 +46,9 @@ class MemberStatusResponse {
     required this.expired,
     required this.expired,
     required this.permanent,
     required this.permanent,
     required this.deviceId,
     required this.deviceId,
+    this.trialed,
+    this.avatar,
+    this.trialEndTimestamp
   });
   });
 
 
   // 反序列化:从 JSON 到 Dart 对象
   // 反序列化:从 JSON 到 Dart 对象

+ 6 - 0
lib/data/api/response/member_status_response.g.dart

@@ -17,6 +17,9 @@ MemberStatusResponse _$MemberStatusResponseFromJson(
       expired: json['expired'] as bool,
       expired: json['expired'] as bool,
       permanent: json['permanent'] as bool,
       permanent: json['permanent'] as bool,
       deviceId: json['deviceId'] as String,
       deviceId: json['deviceId'] as String,
+      trialed: json['trialed'] as bool?,
+      avatar: json['avatar'] as String?,
+      trialEndTimestamp: (json['trialEndTimestamp'] as num?)?.toInt(),
     );
     );
 
 
 Map<String, dynamic> _$MemberStatusResponseToJson(
 Map<String, dynamic> _$MemberStatusResponseToJson(
@@ -30,4 +33,7 @@ Map<String, dynamic> _$MemberStatusResponseToJson(
       'expired': instance.expired,
       'expired': instance.expired,
       'permanent': instance.permanent,
       'permanent': instance.permanent,
       'deviceId': instance.deviceId,
       'deviceId': instance.deviceId,
+      'trialed': instance.trialed,
+      'avatar': instance.avatar,
+      'trialEndTimestamp': instance.trialEndTimestamp,
     };
     };

+ 23 - 0
lib/data/api/response/member_trial_info_response.dart

@@ -0,0 +1,23 @@
+
+import 'package:json_annotation/json_annotation.dart';
+
+part 'member_trial_info_response.g.dart'; // 自动生成的代码文件
+
+@JsonSerializable()
+class MemberTrialInfoResponse {
+
+  @JsonKey(name: 'watchTimes')
+  final int? watchTimes;
+
+  @JsonKey(name: 'trackCount')
+  final int? trackCount;
+
+  MemberTrialInfoResponse({
+    this.watchTimes,
+    this.trackCount,
+  });
+
+  // 反序列化:从 JSON 到 Dart 对象
+  factory MemberTrialInfoResponse.fromJson(Map<String, dynamic> json) =>
+      _$MemberTrialInfoResponseFromJson(json);
+}

+ 21 - 0
lib/data/api/response/member_trial_info_response.g.dart

@@ -0,0 +1,21 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'member_trial_info_response.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+MemberTrialInfoResponse _$MemberTrialInfoResponseFromJson(
+        Map<String, dynamic> json) =>
+    MemberTrialInfoResponse(
+      watchTimes: (json['watchTimes'] as num?)?.toInt(),
+      trackCount: (json['trackCount'] as num?)?.toInt(),
+    );
+
+Map<String, dynamic> _$MemberTrialInfoResponseToJson(
+        MemberTrialInfoResponse instance) =>
+    <String, dynamic>{
+      'watchTimes': instance.watchTimes,
+      'trackCount': instance.trackCount,
+    };

+ 18 - 0
lib/data/bean/member_status_info.dart

@@ -2,16 +2,34 @@ import 'package:intl/intl.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/resource/string.gen.dart';
 
 
 class MemberStatusInfo {
 class MemberStatusInfo {
+  final String? userId;
+  final bool? trialed;
   final int level;
   final int level;
   final int endTimestamp;
   final int endTimestamp;
   final bool expired;
   final bool expired;
   final bool permanent;
   final bool permanent;
+  final int? startTimestamp;
+  final int? serverTimestamp;
+  final String? subscriptionGroup;
+  final int? autoRenewStatus;
+  final bool? subscriptionExpired;
+  final String? avatar;
+  final int? trialEndTimestamp;
 
 
   MemberStatusInfo({
   MemberStatusInfo({
     required this.level,
     required this.level,
     required this.endTimestamp,
     required this.endTimestamp,
     required this.expired,
     required this.expired,
     required this.permanent,
     required this.permanent,
+    this.userId,
+    this.trialed,
+    this.startTimestamp,
+    this.serverTimestamp,
+    this.subscriptionGroup,
+    this.autoRenewStatus,
+    this.subscriptionExpired,
+    this.avatar,
+    this.trialEndTimestamp
   });
   });
 
 
   /// 获取会员等级描述
   /// 获取会员等级描述

+ 1 - 1
lib/data/consts/constants.dart

@@ -9,7 +9,7 @@ class Constants {
 
 
   static const String envProd = 'prod';
   static const String envProd = 'prod';
 
 
-  static const String _devBaseUrl = "http://192.168.10.230:8880";
+  static const String _devBaseUrl = "https://ws00.by.takin.cc";//"http://192.168.10.230:8880";
 
 
   static const String _testBaseUrl = "http://loc-api.v8dashen.com";
   static const String _testBaseUrl = "http://loc-api.v8dashen.com";
 
 

+ 5 - 1
lib/data/repositories/account_repository.dart

@@ -182,7 +182,11 @@ class AccountRepository {
           level: response.level,
           level: response.level,
           endTimestamp: response.endTimestamp,
           endTimestamp: response.endTimestamp,
           expired: response.expired,
           expired: response.expired,
-          permanent: response.permanent);
+          permanent: response.permanent,
+          trialed: response.trialed,
+          avatar: response.avatar,
+          trialEndTimestamp: response.trialEndTimestamp
+      );
       this.memberStatusInfo.value = memberStatusInfo;
       this.memberStatusInfo.value = memberStatusInfo;
       return response;
       return response;
     });
     });

+ 11 - 0
lib/data/repositories/member_repository.dart

@@ -11,6 +11,7 @@ import '../api/request/order_status_request.dart';
 import '../api/request/submit_and_request_pay_request.dart';
 import '../api/request/submit_and_request_pay_request.dart';
 import '../api/request/subscription_resume_request.dart';
 import '../api/request/subscription_resume_request.dart';
 import '../api/response/item_list_response.dart';
 import '../api/response/item_list_response.dart';
+import '../api/response/member_trial_info_response.dart';
 import '../api/response/request_pay_response.dart';
 import '../api/response/request_pay_response.dart';
 import '../api/response/subscription_check_response.dart';
 import '../api/response/subscription_check_response.dart';
 
 
@@ -70,4 +71,14 @@ class MemberRepository {
     return atmobApi.subscriptionresume(SubscriptionResumeRequest(payMethod, receiptData))
     return atmobApi.subscriptionresume(SubscriptionResumeRequest(payMethod, receiptData))
         .then(HttpHandler.handle(true));
         .then(HttpHandler.handle(true));
   }
   }
+
+  //试用结束查看试用信息
+  Future<MemberTrialInfoResponse>memberTrailInfo() {
+    return atmobApi.memberTrailInfo(AppBaseRequest())
+        .then(HttpHandler.handle(false))
+        .then((MemberTrialInfoResponse trialInfoResponse) {
+          return trialInfoResponse;
+    });
+  }
+
 }
 }

+ 8 - 0
lib/data/repositories/track_repository.dart

@@ -1,3 +1,5 @@
+import 'dart:ffi';
+
 import 'package:dio/dio.dart';
 import 'package:dio/dio.dart';
 import 'package:injectable/injectable.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/app_base_request.dart';
 import 'package:location/base/app_base_request.dart';
@@ -32,4 +34,10 @@ class TrackRepository {
                 connectTimeout: Duration(minutes: 2)))
                 connectTimeout: Duration(minutes: 2)))
         .then(HttpHandler.handle(true));
         .then(HttpHandler.handle(true));
   }
   }
+
+  ///试用期间上报查看轨迹次数
+  Future<void> refreshMemberTrailTrack() {
+    return atmobApi.memberTrailTrack(AppBaseRequest()).then(HttpHandler.handle(true));
+  }
+
 }
 }

+ 10 - 10
lib/di/get_it.config.dart

@@ -56,29 +56,29 @@ extension GetItInjectableX on _i174.GetIt {
       environmentFilter,
       environmentFilter,
     );
     );
     final networkModule = _$NetworkModule();
     final networkModule = _$NetworkModule();
+    gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i756.TrackDetailController>(
+        () => _i756.TrackDetailController());
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
-    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
     gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
+    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i108.PermissionSettingController>(
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
         () => _i108.PermissionSettingController());
-    gh.factory<_i973.SplashController>(() => _i973.SplashController());
-    gh.factory<_i756.TrackDetailController>(
-        () => _i756.TrackDetailController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i220.AtmobLocationClient>(
     gh.lazySingleton<_i220.AtmobLocationClient>(
         () => _i220.AtmobLocationClient());
         () => _i220.AtmobLocationClient());
     gh.singleton<_i243.AtmobApi>(
     gh.singleton<_i243.AtmobApi>(
         () => networkModule.provideAtmobApi(gh<_i361.Dio>()));
         () => networkModule.provideAtmobApi(gh<_i361.Dio>()));
+    gh.lazySingleton<_i240.TrackRepository>(
+        () => _i240.TrackRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i20.AccountRepository>(
     gh.lazySingleton<_i20.AccountRepository>(
         () => _i20.AccountRepository(gh<_i243.AtmobApi>()));
         () => _i20.AccountRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i850.ContactRepository>(
-        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i1053.FriendsRepository>(
     gh.lazySingleton<_i1053.FriendsRepository>(
         () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
         () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i850.ContactRepository>(
+        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i791.MessageRepository>(
     gh.lazySingleton<_i791.MessageRepository>(
         () => _i791.MessageRepository(gh<_i243.AtmobApi>()));
         () => _i791.MessageRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i240.TrackRepository>(
-        () => _i240.TrackRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i983.UrgentContactRepository>(
     gh.lazySingleton<_i983.UrgentContactRepository>(
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
     gh.factory<_i1008.LoginController>(
     gh.factory<_i1008.LoginController>(
@@ -121,10 +121,10 @@ extension GetItInjectableX on _i174.GetIt {
               gh<_i983.UrgentContactRepository>(),
               gh<_i983.UrgentContactRepository>(),
               gh<_i20.AccountRepository>(),
               gh<_i20.AccountRepository>(),
             ));
             ));
-    gh.factory<_i897.AddFriendDialogController>(
-        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.factory<_i492.FriendSettingController>(
     gh.factory<_i492.FriendSettingController>(
         () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
         () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
+    gh.factory<_i897.AddFriendDialogController>(
+        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.lazySingleton<_i814.MemberRepository>(() => _i814.MemberRepository(
     gh.lazySingleton<_i814.MemberRepository>(() => _i814.MemberRepository(
           gh<_i243.AtmobApi>(),
           gh<_i243.AtmobApi>(),
           gh<_i20.AccountRepository>(),
           gh<_i20.AccountRepository>(),

+ 1 - 0
lib/module/main/main_controller.dart

@@ -279,6 +279,7 @@ class MainController extends BaseController {
 
 
 
 
   void onViewTraceClick(UserInfo userInfo) {
   void onViewTraceClick(UserInfo userInfo) {
+    print("userInfosfsdf--${userInfo}");
     if (!accountRepository.isLogin.value) {
     if (!accountRepository.isLogin.value) {
       showTraceTipsDialog(onConfirm: () {
       showTraceTipsDialog(onConfirm: () {
         LoginPage.start();
         LoginPage.start();

+ 14 - 0
lib/module/mine/mine_controller.dart

@@ -4,6 +4,7 @@ import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:injectable/injectable.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/base/base_controller.dart';
+import 'package:location/data/api/response/member_trial_info_response.dart';
 import 'package:location/data/bean/member_status_info.dart';
 import 'package:location/data/bean/member_status_info.dart';
 import 'package:location/data/consts/error_code.dart';
 import 'package:location/data/consts/error_code.dart';
 import 'package:location/data/repositories/config_repository.dart';
 import 'package:location/data/repositories/config_repository.dart';
@@ -24,6 +25,7 @@ import '../../utils/toast_util.dart';
 import '../about/about_page.dart';
 import '../about/about_page.dart';
 import '../browser/browser_view.dart';
 import '../browser/browser_view.dart';
 import '../permission/permission_setting_page.dart';
 import '../permission/permission_setting_page.dart';
+import 'mine_expiration_reminder_dialog.dart';
 
 
 @injectable
 @injectable
 class MineController extends BaseController {
 class MineController extends BaseController {
@@ -139,4 +141,16 @@ class MineController extends BaseController {
   void onMemberCardClick() {
   void onMemberCardClick() {
     MemberPage.start();
     MemberPage.start();
   }
   }
+
+  ///会员倒计时到期弹出提示窗
+  void promptWindowPopsCountdownExpires() {
+    memberRepository
+        .memberTrailInfo()
+        .then((infoRespons) {
+      MineExpirationReminderDialog.show(infoResponse: infoRespons?? MemberTrialInfoResponse(watchTimes: 0,trackCount: 0),onDic: () {
+        onMemberCardClick();
+      });
+      //MineExpirationReminderDialog.show(infoResponse: infoResponse);
+    }).catchError((){});
+  }
 }
 }

+ 390 - 0
lib/module/mine/mine_expiration_reminder_dialog.dart

@@ -0,0 +1,390 @@
+
+import 'dart:ui';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/utils/common_expand.dart';
+import 'package:retrofit/http.dart';
+
+import '../../data/api/response/member_trial_info_response.dart';
+import '../../resource/assets.gen.dart';
+import '../../resource/colors.gen.dart';
+import '../../resource/string.gen.dart';
+
+class MineExpirationReminderDialog {
+  static void show({
+    required MemberTrialInfoResponse infoResponse,
+    VoidCallback? cancelOnTap,
+    VoidCallback? onDic,}) {
+    Get.dialog(
+        SimpleDialog(
+          //title: Text('提示'),
+          titlePadding: EdgeInsets.zero,
+          contentPadding: EdgeInsets.zero,
+          insetPadding: EdgeInsets.zero,
+          backgroundColor:Colors.transparent,
+          children: [
+            MineExpirationReminderTipView(
+                infoResponse: infoResponse,
+                cancelOnTap: () {
+                  Get.back();
+                },
+                confirmOnTap: onDic)
+          ],
+        )
+    );
+  }
+}
+
+class MineExpirationReminderTipView extends StatefulWidget {
+  final MemberTrialInfoResponse infoResponse;
+  final VoidCallback? cancelOnTap;
+  final VoidCallback? confirmOnTap;
+
+  const MineExpirationReminderTipView({
+    super.key,
+    required this.infoResponse,
+    this.cancelOnTap,
+    required this.confirmOnTap,
+  });
+
+  @override
+  State<MineExpirationReminderTipView> createState() => _MineExpirationReminderTipViewState();
+}
+
+class _MineExpirationReminderTipViewState extends State<MineExpirationReminderTipView> {
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: 1.sw,
+      padding: EdgeInsets.only(left: 36.w,right: 36.w,bottom: 16.w),
+      decoration: BoxDecoration(
+        color: Colors.transparent,
+        //borderRadius: BorderRadius.circular(16.w),
+        image: DecorationImage(
+            image: Assets.images.iconMineTrialExpirationBg.provider(),
+            fit: BoxFit.fill,
+        )
+      ),
+      child: IntrinsicHeight(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.start,
+          children: [
+            SizedBox(height: 54.1.w + 40.w,),
+            Container(
+              alignment: Alignment.centerLeft,
+              child: Text("您的安全防护已暂停!",
+                  style: TextStyle(
+                      fontSize: 19.sp,
+                      color: '#5E60FE'.color,
+                      fontWeight: FontWeight.bold)
+              ),
+            ),
+            SizedBox(height: 9.w,),
+            Row(
+              children: [
+                Assets.images.iconMineTrialExpirationHeader.image(width: 52.w,height: 52.w),
+                SizedBox(width: 6.w,),
+                Column(
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    RichText(
+                      text: TextSpan(
+                        text: '您已守护了Ta ',
+                        style: TextStyle(
+                          fontSize: 10.sp,
+                          color: Color(0xFF5E60FE),
+                          fontWeight: FontWeight.w400,
+                        ),
+                        children: [
+                          TextSpan(
+                            text: '${widget.infoResponse.watchTimes}',
+                            style: TextStyle(
+                              fontSize: 13.sp, // 加大字号
+                              color: "#7B7DFF".color, // 红色
+                              fontWeight: FontWeight.bold, // 加粗强调
+                            ),
+                          ),
+                          TextSpan(
+                            text: ' 次,',
+                            style: TextStyle(
+                              fontSize: 10.sp,
+                              color: Color(0xFF5E60FE),
+                              fontWeight: FontWeight.w400,
+                            ),
+                          ),
+                        ],
+                      ),
+                    ),
+                    RichText(
+                      text: TextSpan(
+                        text: '并且有 ',
+                        style: TextStyle(
+                          fontSize: 10.sp,
+                          color: Color(0xFF5E60FE),
+                          fontWeight: FontWeight.w400,
+                        ),
+                        children: [
+                          TextSpan(
+                            text: '${widget.infoResponse.trackCount}',
+                            style: TextStyle(
+                              fontSize: 13.sp, // 加大字号
+                              color: "#7B7DFF".color, // 红色
+                              fontWeight: FontWeight.bold, // 加粗强调
+                            ),
+                          ),
+                          TextSpan(
+                            text: ' 条重要轨迹即将消失。',
+                            style: TextStyle(
+                              fontSize: 10.sp,
+                              color: Color(0xFF5E60FE),
+                              fontWeight: FontWeight.w400,
+                            ),
+                          ),
+                        ],
+                      ),
+                    ),
+                  ],
+                )
+              ],
+            ),
+            SizedBox(height: 17.w,),
+            Stack(
+              children: [
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.center,
+                  children: [
+                    Expanded(
+                      child: _regularMember(),
+                    ),
+                    SizedBox(width: 8.w,),
+                    Expanded(
+                        child: _memberUsers()
+                    )
+                  ],
+                ),
+                Positioned(
+                    width: 56.w,
+                    height: 74.w,
+                    bottom: 0,
+                    left: (MediaQuery.of(Get.context!).size.width - 36.w * 2.0) / 2.0 - 36.w + 4.w,
+                    child: Assets.images.iconMineTrialExpirationUp.image(width: 56.w,height: 75.w)
+                )
+              ],
+            ),
+            SizedBox(height: 16.w,),
+            Container(
+              decoration: BoxDecoration(
+                gradient: LinearGradient(
+                  begin: Alignment.centerLeft, // 90度相当于从左到右
+                  end: Alignment.centerRight,
+                  colors: [
+                    Color(0xFF7B7DFF), // #7B7DFF
+                    Color(0xFF6365FF), // #6365FF
+                  ],
+                  stops: [0.0, 1.0],
+                  // 从0%到100%
+                ),
+                borderRadius: BorderRadius.circular(43.w / 2.0),
+              ),
+              height: 43.w,
+              alignment: Alignment.center,
+              child: GestureDetector(
+                onTap: () {
+                  widget.confirmOnTap;
+                  Get.back();
+                },
+                child: Text(StringName.memberVipRenew,
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: '#FFFFFF'.color,
+                        fontWeight: FontWeight.w500)
+                ),
+              ),
+            ),
+            SizedBox(
+              height: 12.w,
+            ),
+            Container(
+              height: 20.w,
+              child: GestureDetector(
+                onTap: widget.cancelOnTap,
+                child: Text("下次再说",
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: '#898996'.color,
+                        fontWeight: FontWeight.w500)
+                ),
+              ),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+
+  //普通会员
+  Widget _regularMember() {
+    return Container(
+      padding: EdgeInsets.only(top: 16.w,bottom: 32.w),
+      decoration: BoxDecoration(
+        gradient: LinearGradient(
+          begin: Alignment.bottomCenter, // 0deg相当于从底部开始
+          end: Alignment.topCenter,
+          colors: [
+            Color(0xFFFFFFFF), // #FFF
+            Color(0xFFE9E9FF), // #E9E9FF
+          ],
+          stops: [0.6629, 0.9994],
+        ),
+        border: Border.all(
+          color: Color(0xFFFFFFFF), // #FFF
+          width: 1.5,
+        ),
+        borderRadius: BorderRadius.circular(14.w),
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          Text("普通会员",
+              style: TextStyle(
+                  fontSize: 11.sp,
+                  color: "#333333".color,
+                  fontWeight: FontWeight.w500)
+          ),
+          SizedBox(height: 12.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "实时定位", "15分钟试用"),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationQuestion.image(width: 12.w,height: 12.w), "轨迹回溯", "--",isStop: true),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationQuestion.image(width: 12.w,height: 12.w), "紧急警报", "--",isStop: true),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "专属客服通道", "普通通道"),
+        ],
+      ),
+    );
+  }
+
+  //会员用户
+  Widget _memberUsers() {
+    return Container(
+      padding: EdgeInsets.only(top: 12.w,bottom: 0),
+      decoration: BoxDecoration(
+        gradient: LinearGradient(
+          begin: Alignment.topCenter, // 180度相当于从上到下
+          end: Alignment.bottomCenter,
+          colors: [
+            Color(0xFFFFE1C5), // #FFE1C5
+            Color(0xFFFFFFFF), // #FFF
+          ],
+          stops: [0.0, 0.3676], // 对应0%和36.76%的位置
+        ),
+        border: Border.all(
+          color: Color(0xFFFFFFFF), // #FFF
+          width: 1.5, // 描边宽度1.5px
+        ),
+        borderRadius: BorderRadius.circular(14.w), // 可根据需要设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              Text("会员用户",
+                  style: TextStyle(
+                      fontSize: 11.sp,
+                      color: "#333333".color,
+                      fontWeight: FontWeight.w500)
+              ),
+              SizedBox(width: 2.w,),
+              Assets.images.iconMineTrialExpirationRecommend.image(width: 15.w,height: 15.w)
+            ],
+          ),
+          SizedBox(height: 12.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "实时定位", "无限使用"),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "轨迹回溯", "无限回溯"),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "紧急警报", "安全自动预警"),
+          SizedBox(height: 4.w,),
+          _memberUntiItem(Assets.images.iconMineTrialExpirationHave.image(width: 12.w,height: 12.w), "专属客服通道", "1V1专属通道"),
+          Container(
+            alignment: Alignment.topRight,
+            child: Assets.images.iconMineTrialExpirationVip.image(width: 45.w,height: 35.w),
+          )
+        ],
+      ),
+    );
+  }
+
+
+  //通用item
+  Widget _memberUntiItem(Image image,String title,String descrip,{bool? isStop = false}) {
+    return Container(
+      height: 36.5.w,
+      padding: EdgeInsets.only(left: 26.w),
+      child: Row(
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          Container(
+            padding: EdgeInsets.only(top: 5.w),
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                Row(children: [
+                  image,
+                  SizedBox(width: 9.5.w,),
+                  Text(title,
+                      style: TextStyle(
+                          fontSize: 11.sp,
+                          color: '#333333'.color,
+                          fontWeight: FontWeight.w500)
+                  ),
+                ],),
+                SizedBox(width: 4.w,),
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    SizedBox(width: 21.5,),
+                    Text(descrip,
+                        textAlign: TextAlign.left,
+                        style: TextStyle(
+                            fontSize: 9.sp,
+                            color: '#898996'.color,
+                            fontWeight: FontWeight.w400)
+                    )
+                  ],
+                ),
+              ],
+            ),
+          ),
+          SizedBox(width: 1.w,),
+          Container(
+            padding: EdgeInsets.symmetric(vertical: 0),
+            alignment: Alignment.topCenter,
+            child: Visibility(
+              visible: isStop ?? false,
+              child: Container(
+                padding: EdgeInsets.symmetric(horizontal: 4.w,vertical: 1.5.w),
+                decoration: BoxDecoration(
+                    image: DecorationImage(image: Assets.images.iconMineTrialExpirationPauseBg.provider())
+                ),
+                child: Text("暂停服务",
+                    style: TextStyle(
+                        fontSize: 8.sp,
+                        color: ColorName.white,
+                        fontWeight: FontWeight.w400)
+                ),
+              ),
+            ),
+          )
+        ],
+      )
+    );
+  }
+}

+ 97 - 32
lib/module/mine/mine_page.dart

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/base/base_page.dart';
+import 'package:location/data/bean/member_status_info.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/resource/string.gen.dart';
@@ -12,6 +13,7 @@ import '../../router/app_pages.dart';
 import '../../utils/date_util.dart';
 import '../../utils/date_util.dart';
 import '../../widget/common_view.dart';
 import '../../widget/common_view.dart';
 import 'mine_controller.dart';
 import 'mine_controller.dart';
+import 'mine_trial_membership_countdown_text.dart';
 
 
 class MinePage extends BasePage<MineController> {
 class MinePage extends BasePage<MineController> {
   const MinePage({super.key});
   const MinePage({super.key});
@@ -239,40 +241,103 @@ class MinePage extends BasePage<MineController> {
   }
   }
 
 
   Widget buildMemberCard() {
   Widget buildMemberCard() {
-    return GestureDetector(
-      onTap: controller.onMemberCardClick,
-      child: AspectRatio(
-        aspectRatio: 332 / 75,
-        child: Container(
-          margin: EdgeInsets.symmetric(horizontal: 14.w),
-          decoration: BoxDecoration(
-              image: DecorationImage(
-                  image: Assets.images.bgMineMemberCard.provider(),
-                  fit: BoxFit.fill)),
-          child: Row(
-            children: [
-              SizedBox(width: 14.w),
-              Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
-                mainAxisAlignment: MainAxisAlignment.center,
-                children: [
-                  Row(
-                    children: [
-                      Assets.images.iconMineUnlockVip.image(width: 68.w),
-                      SizedBox(width: 6.5.w),
-                      Assets.images.iconMineSmallVip
-                          .image(width: 21.6.w, height: 21.6.w),
-                    ],
-                  ),
-                  SizedBox(height: 6.w),
-                  buildMemberCardVipDesc()
-                ],
+    print("controllerffemberStatusInfos--${controller.memberStatusInfo}");
+    return Container(
+      decoration: BoxDecoration(
+          borderRadius: BorderRadius.only(
+              topLeft: Radius.circular(20.w),
+              topRight: Radius.circular(20.w),
+              bottomLeft: Radius.circular(8.w),
+              bottomRight: Radius.circular(8.w)),
+          gradient: LinearGradient(
+              begin: Alignment.centerLeft,
+              end: Alignment.centerRight,
+              stops: [0.0, 0.1],
+              colors: ['#FFF8DA'.color, '#FFF1BA'.color])),
+      margin: EdgeInsets.symmetric(horizontal: 14.w),
+      child: Column(
+        children: [
+          GestureDetector(
+            onTap: controller.onMemberTryOutClick,
+            child: AspectRatio(
+              aspectRatio: 332 / 75,
+              child: Container(
+                //margin: EdgeInsets.symmetric(horizontal: 14.w),
+                decoration: BoxDecoration(
+                    image: DecorationImage(
+                        image: Assets.images.bgMineMemberCard.provider(),
+                        fit: BoxFit.fill)),
+                child: Row(
+                  children: [
+                    SizedBox(width: 14.w),
+                    Column(
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      mainAxisAlignment: MainAxisAlignment.center,
+                      children: [
+                        Row(
+                          children: [
+                            Assets.images.iconMineUnlockVip.image(width: 68.w),
+                            SizedBox(width: 6.5.w),
+                            Assets.images.iconMineSmallVip
+                                .image(width: 21.6.w, height: 21.6.w),
+                          ],
+                        ),
+                        SizedBox(height: 6.w),
+                        buildMemberCardVipDesc()
+                      ],
+                    ),
+                    Spacer(),
+                    buildBuyMemberCardBtn()
+                  ],
+                ),
               ),
               ),
-              Spacer(),
-              buildBuyMemberCardBtn()
-            ],
+            ),
           ),
           ),
-        ),
+          Obx(() {
+            return Visibility(
+                visible: controller.isLogin,
+                child: GestureDetector(
+                  onTap:!(controller.memberStatusInfo?.trialed ?? false) ? controller.promptWindowPopsCountdownExpires : null,
+                  child: Container(
+                    width: double.infinity,
+                    padding: EdgeInsets.symmetric(horizontal: 15.w),
+                    height: 32.w,
+                    child: Row(
+                      children: [
+                        Assets.images.iconMemberVipSign.image(width: 16.w,height: 16.w),
+                        SizedBox(width: 4.w,),
+                        Expanded(
+                          child: Obx(() {
+                            print("controllerffemberStatusInfos-CT-${controller.memberStatusInfo}");
+                            return MineTrialMembershipCountdownText(
+                              memberStatusInfo: controller.memberStatusInfo ?? MemberStatusInfo(level: 0, endTimestamp: 0, expired: false, permanent: false),
+                              trialHasExpiredCallBack: controller.promptWindowPopsCountdownExpires,
+                            );
+                          }),
+                        ),
+                        Visibility(
+                            visible: !(controller.memberStatusInfo?.trialed ?? false),
+                            child: Row(
+                              children: [
+                                Text(
+                                    StringName.memberExperienceVipReceive,
+                                    style: TextStyle(
+                                        fontSize: 13.sp,
+                                        color: "#8A5F03".color,
+                                        fontWeight: FontWeight.w400
+                                    )
+                                ),
+                                Assets.images.iconMemberVipMore.image(width: 16.w,height: 16.w)
+                              ],
+                            )
+                        ),
+                      ],
+                    ),
+                  ),
+                )
+            );
+          })
+        ],
       ),
       ),
     );
     );
   }
   }

+ 125 - 0
lib/module/mine/mine_trial_membership_countdown_text.dart

@@ -0,0 +1,125 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../data/bean/member_status_info.dart';
+import '../../resource/string.gen.dart';
+
+class MineTrialMembershipCountdownText extends StatefulWidget {
+  final MemberStatusInfo? memberStatusInfo;
+  final VoidCallback? trialHasExpiredCallBack;
+
+  const MineTrialMembershipCountdownText({
+    super.key,
+    this.memberStatusInfo,
+    this.trialHasExpiredCallBack
+  });
+
+  @override
+  State<MineTrialMembershipCountdownText> createState() => _MineTrialMembershipCountdownTextState();
+}
+
+class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCountdownText> {
+  late Timer _timer;
+  String _countdownText = '';
+
+  @override
+  void initState() {
+    super.initState();
+    print("controllerffemberStatusInfos-B-${widget.memberStatusInfo}");
+    _updateTime();
+
+    // 创建倒计时定时器
+    if (widget.memberStatusInfo?.trialed == true &&
+        widget.memberStatusInfo?.level == 20 &&
+        (widget.memberStatusInfo?.trialEndTimestamp ?? 0) > 0 ) {
+      // 计算剩余时间
+      DateTime remaining = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
+      if (remaining.second > 0) {
+        // 创建每秒更新一次的定时器
+        _timer = Timer.periodic(Duration(seconds: 1), (_) => _updateTime());
+      }
+    }
+  //  _timer = Timer.periodic(widget.updateInterval, (_) => _updateTime());
+  }
+
+  void _updateTime() {
+
+    print("widgetemberStatusInforialedsfsfdjs---${widget.memberStatusInfo?.trialed}---${(widget.memberStatusInfo?.level ?? 0)}");
+    _countdownText = StringName.memberExperienceVip;
+    if ((widget.memberStatusInfo?.trialed ?? false)) {
+      ///正在使用
+      if ((widget.memberStatusInfo?.level ?? 0) == 20) {
+        _countdownisInProgress();
+      } else {
+        _timer.cancel();
+        if (widget.trialHasExpiredCallBack != null) {
+          widget.trialHasExpiredCallBack!();
+        }
+        //已经使用完了
+        _countdownText = StringName.memberTrialHasExpired;
+      }
+    }
+    if (mounted) {
+      setState(() {});
+    }
+  }
+
+  ///正在倒计时
+  void _countdownisInProgress() {
+    if (widget.memberStatusInfo?.trialEndTimestamp == null) {
+      _countdownText = StringName.memberExperienceVip;
+      return;
+    }
+
+    // 将时间戳转换为DateTime
+    /*DateTime endTime;
+    if (widget.timestampInSeconds) {
+      // 时间戳单位为秒
+      endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp! * 1000);
+    } else {
+      // 时间戳单位为毫秒
+      endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp!);
+    }*/
+
+    DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
+
+    Duration remaining = endTime.difference(DateTime.now());
+
+    if (remaining.inSeconds <= 0) {
+      _countdownText = StringName.memberTrialHasExpired;
+      _timer.cancel();
+    } else {
+      _countdownText = _formatDuration(remaining);
+      _countdownText = '${StringName.memberCountdownRemaining} ${_countdownText} ${StringName.memberCountdownExperienceTime}';
+    }
+  }
+
+  String _formatDuration(Duration duration) {
+    String twoDigits(int n) => n.toString().padLeft(2, '0');
+    String hours = twoDigits(duration.inHours);
+    String minutes = twoDigits(duration.inMinutes.remainder(60));
+    String seconds = twoDigits(duration.inSeconds.remainder(60));
+    return '$hours:$minutes:$seconds';
+  }
+
+  @override
+  void dispose() {
+    _timer.cancel();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return  Text(
+        _countdownText,
+        style: TextStyle(
+            fontSize: 13.sp,
+            color: "#8A5F03".color,
+            fontWeight: FontWeight.bold
+        )
+    );
+  }
+}

+ 11 - 0
lib/module/track/track_controller.dart

@@ -7,6 +7,7 @@ import 'package:get/get_core/src/get_main.dart';
 import 'package:injectable/injectable.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/bean/location_info.dart';
 import 'package:location/data/bean/location_info.dart';
+import 'package:location/data/bean/member_status_info.dart';
 import 'package:location/data/consts/constants.dart';
 import 'package:location/data/consts/constants.dart';
 import 'package:location/data/consts/error_code.dart';
 import 'package:location/data/consts/error_code.dart';
 import 'package:location/data/repositories/account_repository.dart';
 import 'package:location/data/repositories/account_repository.dart';
@@ -92,12 +93,22 @@ class TrackController extends BaseController
     tabController.addListener(_handleTabChange);
     tabController.addListener(_handleTabChange);
     _initTime();
     _initTime();
     _onCurrentLocationQuery(isShow: false);
     _onCurrentLocationQuery(isShow: false);
+
   }
   }
 
 
   @override
   @override
   void onReady() {
   void onReady() {
     super.onReady();
     super.onReady();
     sheetController.expand();
     sheetController.expand();
+    _recordNumberTrajectoryViewed();
+  }
+
+  ///记录查看轨迹的次数
+  void _recordNumberTrajectoryViewed() {
+    print("_recordNumberTrajectoryViewedsfsdf--${accountRepository.memberStatusInfo?.value?.trialed }---${accountRepository.memberStatusInfo?.value?.level}");
+    if (accountRepository.memberStatusInfo?.value?.trialed == true && accountRepository.memberStatusInfo?.value?.level == 20) {
+      trackRepository.refreshMemberTrailTrack();
+    }
   }
   }
 
 
   void _handleTabChange() {
   void _handleTabChange() {

+ 50 - 0
lib/resource/assets.gen.dart

@@ -260,10 +260,18 @@ class $AssetsImagesGen {
   AssetGenImage get iconMemberRetainClose =>
   AssetGenImage get iconMemberRetainClose =>
       const AssetGenImage('assets/images/icon_member_retain_close.webp');
       const AssetGenImage('assets/images/icon_member_retain_close.webp');
 
 
+  /// File path: assets/images/icon_member_vip_more.webp
+  AssetGenImage get iconMemberVipMore =>
+      const AssetGenImage('assets/images/icon_member_vip_more.webp');
+
   /// File path: assets/images/icon_member_vip_receive_arrow.webp
   /// File path: assets/images/icon_member_vip_receive_arrow.webp
   AssetGenImage get iconMemberVipReceiveArrow =>
   AssetGenImage get iconMemberVipReceiveArrow =>
       const AssetGenImage('assets/images/icon_member_vip_receive_arrow.webp');
       const AssetGenImage('assets/images/icon_member_vip_receive_arrow.webp');
 
 
+  /// File path: assets/images/icon_member_vip_sign.webp
+  AssetGenImage get iconMemberVipSign =>
+      const AssetGenImage('assets/images/icon_member_vip_sign.webp');
+
   /// File path: assets/images/icon_message_friend_help.webp
   /// File path: assets/images/icon_message_friend_help.webp
   AssetGenImage get iconMessageFriendHelp =>
   AssetGenImage get iconMessageFriendHelp =>
       const AssetGenImage('assets/images/icon_message_friend_help.webp');
       const AssetGenImage('assets/images/icon_message_friend_help.webp');
@@ -312,6 +320,38 @@ class $AssetsImagesGen {
   AssetGenImage get iconMineSmallVip =>
   AssetGenImage get iconMineSmallVip =>
       const AssetGenImage('assets/images/icon_mine_small_vip.webp');
       const AssetGenImage('assets/images/icon_mine_small_vip.webp');
 
 
+  /// File path: assets/images/icon_mine_trial_expiration_bg.webp
+  AssetGenImage get iconMineTrialExpirationBg =>
+      const AssetGenImage('assets/images/icon_mine_trial_expiration_bg.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_have.webp
+  AssetGenImage get iconMineTrialExpirationHave =>
+      const AssetGenImage('assets/images/icon_mine_trial_expiration_have.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_header.webp
+  AssetGenImage get iconMineTrialExpirationHeader => const AssetGenImage(
+      'assets/images/icon_mine_trial_expiration_header.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_pause_bg.webp
+  AssetGenImage get iconMineTrialExpirationPauseBg => const AssetGenImage(
+      'assets/images/icon_mine_trial_expiration_pause_bg.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_question.webp
+  AssetGenImage get iconMineTrialExpirationQuestion => const AssetGenImage(
+      'assets/images/icon_mine_trial_expiration_question.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_recommend.webp
+  AssetGenImage get iconMineTrialExpirationRecommend => const AssetGenImage(
+      'assets/images/icon_mine_trial_expiration_recommend.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_up.webp
+  AssetGenImage get iconMineTrialExpirationUp =>
+      const AssetGenImage('assets/images/icon_mine_trial_expiration_up.webp');
+
+  /// File path: assets/images/icon_mine_trial_expiration_vip.webp
+  AssetGenImage get iconMineTrialExpirationVip =>
+      const AssetGenImage('assets/images/icon_mine_trial_expiration_vip.webp');
+
   /// File path: assets/images/icon_mine_unlock_vip.webp
   /// File path: assets/images/icon_mine_unlock_vip.webp
   AssetGenImage get iconMineUnlockVip =>
   AssetGenImage get iconMineUnlockVip =>
       const AssetGenImage('assets/images/icon_mine_unlock_vip.webp');
       const AssetGenImage('assets/images/icon_mine_unlock_vip.webp');
@@ -464,7 +504,9 @@ class $AssetsImagesGen {
         iconMemberFun4,
         iconMemberFun4,
         iconMemberFun6,
         iconMemberFun6,
         iconMemberRetainClose,
         iconMemberRetainClose,
+        iconMemberVipMore,
         iconMemberVipReceiveArrow,
         iconMemberVipReceiveArrow,
+        iconMemberVipSign,
         iconMessageFriendHelp,
         iconMessageFriendHelp,
         iconMineFunAbout,
         iconMineFunAbout,
         iconMineFunAccountFeedback,
         iconMineFunAccountFeedback,
@@ -477,6 +519,14 @@ class $AssetsImagesGen {
         iconMineLogged,
         iconMineLogged,
         iconMineNoLogin,
         iconMineNoLogin,
         iconMineSmallVip,
         iconMineSmallVip,
+        iconMineTrialExpirationBg,
+        iconMineTrialExpirationHave,
+        iconMineTrialExpirationHeader,
+        iconMineTrialExpirationPauseBg,
+        iconMineTrialExpirationQuestion,
+        iconMineTrialExpirationRecommend,
+        iconMineTrialExpirationUp,
+        iconMineTrialExpirationVip,
         iconMineUnlockVip,
         iconMineUnlockVip,
         iconMineUrgentContact,
         iconMineUrgentContact,
         iconNews,
         iconNews,

+ 109 - 211
lib/resource/string.gen.dart

@@ -17,8 +17,7 @@ class StringName {
   static String get friendAddTitle => 'friend_add_title'.tr; // 添加好友
   static String get friendAddTitle => 'friend_add_title'.tr; // 添加好友
   static String get friendAddDesc => 'friend_add_desc'.tr; // 查看实时定位,开启轨迹守护
   static String get friendAddDesc => 'friend_add_desc'.tr; // 查看实时定位,开启轨迹守护
   static String get friendAddFromPhone => 'friend_add_from_phone'.tr; // 通过手机号添加
   static String get friendAddFromPhone => 'friend_add_from_phone'.tr; // 通过手机号添加
-  static String get friendAddPhoneEtHint =>
-      'friend_add_phone_et_hint'.tr; // 请输入手机号
+  static String get friendAddPhoneEtHint => 'friend_add_phone_et_hint'.tr; // 请输入手机号
   static String get friendAddAddressBook => 'friend_add_address_book'.tr; // 通讯录
   static String get friendAddAddressBook => 'friend_add_address_book'.tr; // 通讯录
   static String get friendAddFromWx => 'friend_add_from_wx'.tr; // 通过微信添加
   static String get friendAddFromWx => 'friend_add_from_wx'.tr; // 通过微信添加
   static String get friendAddRule => 'friend_add_rule'.tr; // 定位功能需要双方同意方可使用
   static String get friendAddRule => 'friend_add_rule'.tr; // 定位功能需要双方同意方可使用
@@ -27,8 +26,7 @@ class StringName {
   static String get mainHelpTab => 'main_help_tab'.tr; // 一键求助
   static String get mainHelpTab => 'main_help_tab'.tr; // 一键求助
   static String get mainMineTab => 'main_mine_tab'.tr; // 个人中心
   static String get mainMineTab => 'main_mine_tab'.tr; // 个人中心
   static String get mineAccountGoLogin => 'mine_account_go_login'.tr; // 点击登录
   static String get mineAccountGoLogin => 'mine_account_go_login'.tr; // 点击登录
-  static String get mineAccountLoggedDesc =>
-      'mine_account_logged_desc'.tr; // 用户
+  static String get mineAccountLoggedDesc => 'mine_account_logged_desc'.tr; // 用户
   static String get mineNotLoginDesc => 'mine_not_login_desc'.tr; // 登录后可体验更多服务
   static String get mineNotLoginDesc => 'mine_not_login_desc'.tr; // 登录后可体验更多服务
   static String get mineOpenVip => 'mine_open_vip'.tr; // 开通VIP可体验更多服务
   static String get mineOpenVip => 'mine_open_vip'.tr; // 开通VIP可体验更多服务
   static String get mineVip => 'mine_vip'.tr; // 您好,尊贵的VIP用户
   static String get mineVip => 'mine_vip'.tr; // 您好,尊贵的VIP用户
@@ -42,268 +40,178 @@ class StringName {
   static String get memberLevel3660000 => 'member_level_3660000'.tr; // 终身会员
   static String get memberLevel3660000 => 'member_level_3660000'.tr; // 终身会员
   static String get memberLevelUndefined => 'member_level_undefined'.tr; // 未知
   static String get memberLevelUndefined => 'member_level_undefined'.tr; // 未知
   static String get memberTryOut => 'member_try_out'.tr; // 会员试用
   static String get memberTryOut => 'member_try_out'.tr; // 会员试用
-  static String get memberCardNoLoginDesc =>
-      'member_card_no_login_desc'.tr; // 升级VIP会员,享受更多权益
-  static String get memberCardNoVipDesc =>
-      'member_card_no_vip_desc'.tr; // 开通VIP会员,享受更多权益
-  static String get memberCardExpirationDesc =>
-      'member_card_expiration_desc'.tr; // 到期
-  static String get memberCardPermanentVipDesc =>
-      'member_card_permanent_vip_desc'.tr; // 您已是尊贵的永久会员
+  static String get memberCardNoLoginDesc => 'member_card_no_login_desc'.tr; // 升级VIP会员,享受更多权益
+  static String get memberCardNoVipDesc => 'member_card_no_vip_desc'.tr; // 开通VIP会员,享受更多权益
+  static String get memberCardExpirationDesc => 'member_card_expiration_desc'.tr; // 到期
+  static String get memberCardPermanentVipDesc => 'member_card_permanent_vip_desc'.tr; // 您已是尊贵的永久会员
   static String get memberVipUnlock => 'member_vip_unlock'.tr; // 立即解锁
   static String get memberVipUnlock => 'member_vip_unlock'.tr; // 立即解锁
   static String get memberVipRenew => 'member_vip_renew'.tr; // 立即续费
   static String get memberVipRenew => 'member_vip_renew'.tr; // 立即续费
   static String get memberVipPermanent => 'member_vip_permanent'.tr; // 永久会员
   static String get memberVipPermanent => 'member_vip_permanent'.tr; // 永久会员
-  static String get memberExperienceVip =>
-      'member_experience_vip'.tr; // 免费VIP体验礼包
-  static String get memberExperienceVipReceive =>
-      'member_experience_vip_receive'.tr; // 去领取
+  static String get memberExperienceVip => 'member_experience_vip'.tr; // 免费VIP体验礼包
+  static String get memberExperienceVipReceive => 'member_experience_vip_receive'.tr; // 去领取
+  static String get memberTrialHasExpired => 'member_trial_has_expired'.tr; // 会员试用已过期
+  static String get memberCountdownRemaining => 'member_countdown_remaining'.tr; // 剩余
+  static String get memberCountdownExperienceTime => 'member_countdown_experience_time'.tr; // 体验时间
   static String get mineUrgentContact => 'mine_urgent_contact'.tr; // 紧急联系人
   static String get mineUrgentContact => 'mine_urgent_contact'.tr; // 紧急联系人
   static String get mineFunShare => 'mine_fun_share'.tr; // 邀请好友
   static String get mineFunShare => 'mine_fun_share'.tr; // 邀请好友
-  static String get mineFunCustomerService =>
-      'mine_fun_customer_service'.tr; // 专属客服
-  static String get mineFunPermissionSetting =>
-      'mine_fun_permission_setting'.tr; // 权限设置
-  static String get mineFunAccountFeedback =>
-      'mine_fun_account_feedback'.tr; // 用户反馈
+  static String get mineFunCustomerService => 'mine_fun_customer_service'.tr; // 专属客服
+  static String get mineFunPermissionSetting => 'mine_fun_permission_setting'.tr; // 权限设置
+  static String get mineFunAccountFeedback => 'mine_fun_account_feedback'.tr; // 用户反馈
   static String get mineFunAbout => 'mine_fun_about'.tr; // 关于我们
   static String get mineFunAbout => 'mine_fun_about'.tr; // 关于我们
-  static String get mineFunLogoutAccount =>
-      'mine_fun_logout_account'.tr; // 注销账号
+  static String get mineFunLogoutAccount => 'mine_fun_logout_account'.tr; // 注销账号
   static String get mineFunExitAccount => 'mine_fun_exit_account'.tr; // 退出账号
   static String get mineFunExitAccount => 'mine_fun_exit_account'.tr; // 退出账号
   static String get login => 'login'.tr; // 登录
   static String get login => 'login'.tr; // 登录
-  static String get loginSendVerificationCode =>
-      'login_send_verification_code'.tr; // 发送验证码
-  static String get loginRetransmissionCode =>
-      'login_retransmission_code'.tr; // s后重发
+  static String get loginSendVerificationCode => 'login_send_verification_code'.tr; // 发送验证码
+  static String get loginRetransmissionCode => 'login_retransmission_code'.tr; // s后重发
   static String get loginEtPhoneHint => 'login_et_phone_hint'.tr; // 请输入11位手机号码
   static String get loginEtPhoneHint => 'login_et_phone_hint'.tr; // 请输入11位手机号码
   static String get loginEtPrivacyRead => 'login_et_privacy_read'.tr; // 已阅读并同意
   static String get loginEtPrivacyRead => 'login_et_privacy_read'.tr; // 已阅读并同意
   static String get loginEtPrivacyAnd => 'login_et_privacy_and'.tr; // 和
   static String get loginEtPrivacyAnd => 'login_et_privacy_and'.tr; // 和
-  static String get loginPrintVerificationCode =>
-      'login_print_verification_code'.tr; // 请输入验证码
-  static String get loginPrintPhoneVerification =>
-      'login_print_phone_verification'.tr; // 请输入正确格式的手机号码
-  static String get loginAgreePrivacy =>
-      'login_agree_privacy'.tr; // 请先阅读并同意《隐私权政策》和《服务条款》
-  static String get loginVerificationCodeErrorToast =>
-      'login_verification_code_error_toast'.tr; // 验证码输入错误,请重新输入
+  static String get loginPrintVerificationCode => 'login_print_verification_code'.tr; // 请输入验证码
+  static String get loginPrintPhoneVerification => 'login_print_phone_verification'.tr; // 请输入正确格式的手机号码
+  static String get loginAgreePrivacy => 'login_agree_privacy'.tr; // 请先阅读并同意《隐私权政策》和《服务条款》
+  static String get loginVerificationCodeErrorToast => 'login_verification_code_error_toast'.tr; // 验证码输入错误,请重新输入
   static String get accountNoLogin => 'account_no_login'.tr; // 账号未登录
   static String get accountNoLogin => 'account_no_login'.tr; // 账号未登录
-  static String get loginRequestCodeFrequentlyToast =>
-      'login_request_code_frequently_toast'.tr; // 请求过于频繁,请稍后再试
-  static String get loginVerificationCodeRequestFailedToast =>
-      'login_verification_code_request_failed_toast'.tr; // 验证码发送失败,请重试
+  static String get loginRequestCodeFrequentlyToast => 'login_request_code_frequently_toast'.tr; // 请求过于频繁,请稍后再试
+  static String get loginVerificationCodeRequestFailedToast => 'login_verification_code_request_failed_toast'.tr; // 验证码发送失败,请重试
   static String get loginSuccess => 'login_success'.tr; // 登录成功
   static String get loginSuccess => 'login_success'.tr; // 登录成功
-  static String get loginTooOftenToast =>
-      'login_too_often_toast'.tr; // 登录过于频繁,请稍后再试
+  static String get loginTooOftenToast => 'login_too_often_toast'.tr; // 登录过于频繁,请稍后再试
   static String get loginFailedToast => 'login_failed_toast'.tr; // 登录失败
   static String get loginFailedToast => 'login_failed_toast'.tr; // 登录失败
   static String get privacyTitle => 'privacy_title'.tr; // 隐私权政策与服务条款
   static String get privacyTitle => 'privacy_title'.tr; // 隐私权政策与服务条款
   static String get privacyDisagree => 'privacy_disagree'.tr; // 不同意
   static String get privacyDisagree => 'privacy_disagree'.tr; // 不同意
-  static String get privacyDisagreeAndExit =>
-      'privacy_disagree_and_exit'.tr; // 不同意并退出
+  static String get privacyDisagreeAndExit => 'privacy_disagree_and_exit'.tr; // 不同意并退出
   static String get privacyAgree => 'privacy_agree'.tr; // 同意
   static String get privacyAgree => 'privacy_agree'.tr; // 同意
   static String get locationMine => 'location_mine'.tr; // 我
   static String get locationMine => 'location_mine'.tr; // 我
   static String get locationTrace => 'location_trace'.tr; // 轨迹
   static String get locationTrace => 'location_trace'.tr; // 轨迹
   static String get dialogCancel => 'dialog_cancel'.tr; // 取消
   static String get dialogCancel => 'dialog_cancel'.tr; // 取消
   static String get dialogSure => 'dialog_sure'.tr; // 确定
   static String get dialogSure => 'dialog_sure'.tr; // 确定
-  static String get dialogExitAccountTitle =>
-      'dialog_exit_account_title'.tr; // 提示
-  static String get dialogExitAccountDesc =>
-      'dialog_exit_account_desc'.tr; // 确定退出登录吗?
+  static String get dialogExitAccountTitle => 'dialog_exit_account_title'.tr; // 提示
+  static String get dialogExitAccountDesc => 'dialog_exit_account_desc'.tr; // 确定退出登录吗?
   static String get nextStep => 'next_step'.tr; // 下一步
   static String get nextStep => 'next_step'.tr; // 下一步
-  static String get locationBackgroundAlwaysDesc =>
-      'location_background_always_desc'.tr; // 为保位置展示在地图上,请按照图中指引操作
-  static String get dialogAddFriendTitle =>
-      'dialog_add_friend_title'.tr; // 实时定位轨迹
-  static String get dialogAddFriendDesc =>
-      'dialog_add_friend_desc'.tr; // 去添加Ta的手机号码
+  static String get locationBackgroundAlwaysDesc => 'location_background_always_desc'.tr; // 为保位置展示在地图上,请按照图中指引操作
+  static String get dialogAddFriendTitle => 'dialog_add_friend_title'.tr; // 实时定位轨迹
+  static String get dialogAddFriendDesc => 'dialog_add_friend_desc'.tr; // 去添加Ta的手机号码
   static String get dialogAddFriendBtn => 'dialog_add_friend_btn'.tr; // 立即添加
   static String get dialogAddFriendBtn => 'dialog_add_friend_btn'.tr; // 立即添加
   static String get dialogRecordLocation => 'dialog_record_location'.tr; // 记录轨迹
   static String get dialogRecordLocation => 'dialog_record_location'.tr; // 记录轨迹
-  static String get dialogRecordLocationHasPermission =>
-      'dialog_record_location_has_permission'.tr; // 开启定位权限
-  static String get dialogRecordLocationNotRequest =>
-      'dialog_record_location_not_request'.tr; // 暂不开启
-  static String get dialogRecordLocationRequest =>
-      'dialog_record_location_request'.tr; // 立即开启
-  static String get refreshFriendDataSuccess =>
-      'refresh_friend_data_success'.tr; // 好友位置刷新成功
+  static String get dialogRecordLocationHasPermission => 'dialog_record_location_has_permission'.tr; // 开启定位权限
+  static String get dialogRecordLocationNotRequest => 'dialog_record_location_not_request'.tr; // 暂不开启
+  static String get dialogRecordLocationRequest => 'dialog_record_location_request'.tr; // 立即开启
+  static String get refreshFriendDataSuccess => 'refresh_friend_data_success'.tr; // 好友位置刷新成功
   static String get friendTitle => 'friend_title'.tr; // 我守护的人
   static String get friendTitle => 'friend_title'.tr; // 我守护的人
   static String get traceFreeExperience => 'trace_free_experience'.tr; // 免费体验
   static String get traceFreeExperience => 'trace_free_experience'.tr; // 免费体验
   static String get examineTrace => 'examine_trace'.tr; // 查看轨迹
   static String get examineTrace => 'examine_trace'.tr; // 查看轨迹
   static String get unopenedPositioning => 'unopened_positioning'.tr; // 未开启定位
   static String get unopenedPositioning => 'unopened_positioning'.tr; // 未开启定位
-  static String get friendLocationTimeUnknown =>
-      'friend_location_time_unknown'.tr; // 未知
+  static String get friendLocationTimeUnknown => 'friend_location_time_unknown'.tr; // 未知
   static String get friendInfoEdit => 'friend_info_edit'.tr; // 好友编辑
   static String get friendInfoEdit => 'friend_info_edit'.tr; // 好友编辑
-  static String get friendEditRemarkTitle =>
-      'friend_edit_remark_title'.tr; // 备注
+  static String get friendEditRemarkTitle => 'friend_edit_remark_title'.tr; // 备注
   static String get friendEditPhoneTitle => 'friend_edit_phone_title'.tr; // 手机号
   static String get friendEditPhoneTitle => 'friend_edit_phone_title'.tr; // 手机号
-  static String get friendEditBlockTitle =>
-      'friend_edit_block_title'.tr; // 不给Ta看
+  static String get friendEditBlockTitle => 'friend_edit_block_title'.tr; // 不给Ta看
   static String get blockedFriend => 'blocked_friend'.tr; // 已屏蔽该好友
   static String get blockedFriend => 'blocked_friend'.tr; // 已屏蔽该好友
   static String get blockFriendOff => 'block_friend_off'.tr; // 屏蔽好友已关闭
   static String get blockFriendOff => 'block_friend_off'.tr; // 屏蔽好友已关闭
   static String get friendDelete => 'friend_delete'.tr; // 删除好友
   static String get friendDelete => 'friend_delete'.tr; // 删除好友
   static String get kindlyReminder => 'kindly_reminder'.tr; // 温馨提示
   static String get kindlyReminder => 'kindly_reminder'.tr; // 温馨提示
-  static String get friendDeleteContent =>
-      'friend_delete_content'.tr; // 互删好友后,双方将停止位置的分享,以及清除相关定位记录,是否确认互删?
+  static String get friendDeleteContent => 'friend_delete_content'.tr; // 互删好友后,双方将停止位置的分享,以及清除相关定位记录,是否确认互删?
   static String get deleteSuccess => 'delete_success'.tr; // 删除成功
   static String get deleteSuccess => 'delete_success'.tr; // 删除成功
-  static String get copyPhoneNumSuccess =>
-      'copy_phone_num_success'.tr; // 手机号复制成功
-  static String get friendUpdateRemarkTitle =>
-      'friend_update_remark_title'.tr; // 修改备注
-  static String get friendUpdateRemarkHint =>
-      'friend_update_remark_hint'.tr; // 请输入备注
+  static String get copyPhoneNumSuccess => 'copy_phone_num_success'.tr; // 手机号复制成功
+  static String get friendUpdateRemarkTitle => 'friend_update_remark_title'.tr; // 修改备注
+  static String get friendUpdateRemarkHint => 'friend_update_remark_hint'.tr; // 请输入备注
   static String get remarkNoChange => 'remark_no_change'.tr; // 备注未修改
   static String get remarkNoChange => 'remark_no_change'.tr; // 备注未修改
   static String get remarkUpdateSuccess => 'remark_update_success'.tr; // 备注修改成功
   static String get remarkUpdateSuccess => 'remark_update_success'.tr; // 备注修改成功
   static String get friendAddNow => 'friend_add_now'.tr; // 立即添加
   static String get friendAddNow => 'friend_add_now'.tr; // 立即添加
-  static String get goRequestContactsPermission =>
-      'go_request_contacts_permission'.tr; // 去申请
-  static String get requestContactsContent =>
-      'request_contacts_content'.tr; // 申请“通讯录权限”为了更便利读取通信录联系人信息,无需再手动输入
-  static String get permissionRequestFail =>
-      'permission_request_fail'.tr; // 权限申请失败
-  static String get friendAddExplain => 'friend_add_explain'
-      .tr; // 1.在您的对方同意添加您为好友之后,才能查看对方的位置。\n 2.如果您的好友还没有下载该应用,建议您邀请他们下载安装。\n 3.通过同意添加该用户为您的好友,即表示您同意本软件合法地收集、存储和使用您的信息,并将位置等信息与该好友分享。
+  static String get goRequestContactsPermission => 'go_request_contacts_permission'.tr; // 去申请
+  static String get requestContactsContent => 'request_contacts_content'.tr; // 申请“通讯录权限”为了更便利读取通信录联系人信息,无需再手动输入
+  static String get permissionRequestFail => 'permission_request_fail'.tr; // 权限申请失败
+  static String get friendAddExplain => 'friend_add_explain'.tr; // 1.在您的对方同意添加您为好友之后,才能查看对方的位置。\n 2.如果您的好友还没有下载该应用,建议您邀请他们下载安装。\n 3.通过同意添加该用户为您的好友,即表示您同意本软件合法地收集、存储和使用您的信息,并将位置等信息与该好友分享。
   static String get dialogNotLogin => 'dialog_not_login'.tr; // 登录之后才可以发送好友申请
   static String get dialogNotLogin => 'dialog_not_login'.tr; // 登录之后才可以发送好友申请
   static String get dialogGoLogin => 'dialog_go_login'.tr; // 去登录
   static String get dialogGoLogin => 'dialog_go_login'.tr; // 去登录
   static String get inviteFriends => 'invite_friends'.tr; // 邀请好友
   static String get inviteFriends => 'invite_friends'.tr; // 邀请好友
-  static String get inviteContent =>
-      'invite_content'.tr; // 该好友未注册,将应用分享给好友需要好友下载安装并同意授权后可查看定位
+  static String get inviteContent => 'invite_content'.tr; // 该好友未注册,将应用分享给好友需要好友下载安装并同意授权后可查看定位
   static String get inviteBtn => 'invite_btn'.tr; // 去微信分享
   static String get inviteBtn => 'invite_btn'.tr; // 去微信分享
   static String get requestSuccess => 'request_success'.tr; // 发送成功
   static String get requestSuccess => 'request_success'.tr; // 发送成功
   static String get requestFail => 'request_fail'.tr; // 请求失败
   static String get requestFail => 'request_fail'.tr; // 请求失败
   static String get addFriendAdded => 'add_friend_added'.tr; // 该好友已在好友列表
   static String get addFriendAdded => 'add_friend_added'.tr; // 该好友已在好友列表
-  static String get sendAddFriendSuccess =>
-      'send_add_friend_success'.tr; // 好友申请已发出,请等待对方通过
+  static String get sendAddFriendSuccess => 'send_add_friend_success'.tr; // 好友申请已发出,请等待对方通过
   static String get addFriendOwn => 'add_friend_own'.tr; // 不能添加自己为好友
   static String get addFriendOwn => 'add_friend_own'.tr; // 不能添加自己为好友
   static String get shareFriendTitle => 'share_friend_title'.tr; // 邀请好友
   static String get shareFriendTitle => 'share_friend_title'.tr; // 邀请好友
-  static String get shareFriendDesc =>
-      'share_friend_desc'.tr; // 将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
+  static String get shareFriendDesc => 'share_friend_desc'.tr; // 将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
   static String get wechatNoInstall => 'wechat_no_install'.tr; // 微信未安装
   static String get wechatNoInstall => 'wechat_no_install'.tr; // 微信未安装
-  static String get dialogNotLoginViewTraceTip =>
-      'dialog_not_login_view_trace_tip'.tr; // 登录即可体验查看轨迹记录
-  static String get friendNotOpenLocationShare =>
-      'friend_not_open_location_share'.tr; // 该好友没有开启位置分享
+  static String get dialogNotLoginViewTraceTip => 'dialog_not_login_view_trace_tip'.tr; // 登录即可体验查看轨迹记录
+  static String get friendNotOpenLocationShare => 'friend_not_open_location_share'.tr; // 该好友没有开启位置分享
   static String get friendGoInstructHim => 'friend_go_instruct_him'.tr; // 去通知Ta
   static String get friendGoInstructHim => 'friend_go_instruct_him'.tr; // 去通知Ta
   static String get trackQueryPath => 'track_query_path'.tr; // 查询轨迹
   static String get trackQueryPath => 'track_query_path'.tr; // 查询轨迹
-  static String get trackQueryNowLocation =>
-      'track_query_now_location'.tr; // 查询位置
+  static String get trackQueryNowLocation => 'track_query_now_location'.tr; // 查询位置
   static String get trackHistory => 'track_history'.tr; // 历史轨迹
   static String get trackHistory => 'track_history'.tr; // 历史轨迹
   static String get trackNowLocation => 'track_now_location'.tr; // 当前位置
   static String get trackNowLocation => 'track_now_location'.tr; // 当前位置
   static String get trackStartTime => 'track_start_time'.tr; // 开始时间:
   static String get trackStartTime => 'track_start_time'.tr; // 开始时间:
   static String get trackEndTime => 'track_end_time'.tr; // 结束时间:
   static String get trackEndTime => 'track_end_time'.tr; // 结束时间:
   static String get trackStartLocation => 'track_start_location'.tr; // 起点:
   static String get trackStartLocation => 'track_start_location'.tr; // 起点:
   static String get trackEndLocation => 'track_end_location'.tr; // 终点:
   static String get trackEndLocation => 'track_end_location'.tr; // 终点:
-  static String get trackChooseTimeError =>
-      'track_choose_time_error'.tr; // 时间范围不能超过24小时且开始时间需小于结束时间
+  static String get trackChooseTimeError => 'track_choose_time_error'.tr; // 时间范围不能超过24小时且开始时间需小于结束时间
   static String get trackLoadingTxt => 'track_loading_txt'.tr; // 正在查询中...
   static String get trackLoadingTxt => 'track_loading_txt'.tr; // 正在查询中...
   static String get memberExpired => 'member_expired'.tr; // 会员已过期
   static String get memberExpired => 'member_expired'.tr; // 会员已过期
   static String get gotIt => 'got_it'.tr; // 知道了
   static String get gotIt => 'got_it'.tr; // 知道了
-  static String get trackNoData => 'track_no_data'
-      .tr; // 该时段内未查询到历史轨迹记录\n\n1.可能是该用户未登录本软件\n2.可能是该用户未运行我们的软件\n3.可能是对方未开启定位和网络连接等原因
+  static String get trackNoData => 'track_no_data'.tr; // 该时段内未查询到历史轨迹记录\n\n1.可能是该用户未登录本软件\n2.可能是该用户未运行我们的软件\n3.可能是对方未开启定位和网络连接等原因
   static String get newsTitle => 'news_title'.tr; // 消息中心
   static String get newsTitle => 'news_title'.tr; // 消息中心
   static String get newsRequestTitle => 'news_request_title'.tr; // 新的好友
   static String get newsRequestTitle => 'news_request_title'.tr; // 新的好友
   static String get newsRequestDesc => 'news_request_desc'.tr; // 您有新的好友申请,请及时查看
   static String get newsRequestDesc => 'news_request_desc'.tr; // 您有新的好友申请,请及时查看
   static String get newsRequestAgree => 'news_request_agree'.tr; // 已同意
   static String get newsRequestAgree => 'news_request_agree'.tr; // 已同意
   static String get newsRequestDisagree => 'news_request_disagree'.tr; // 已拒绝
   static String get newsRequestDisagree => 'news_request_disagree'.tr; // 已拒绝
   static String get newsToContact => 'news_to_contact'.tr; // 去联系
   static String get newsToContact => 'news_to_contact'.tr; // 去联系
-  static String get messageTryForHelp =>
-      'message_try_for_help'.tr; // 您的好友需要紧急求助,请您尽快联系他!
+  static String get messageTryForHelp => 'message_try_for_help'.tr; // 您的好友需要紧急求助,请您尽快联系他!
   static String get messageAccepted => 'message_accepted'.tr; // 已同意您的好友申请
   static String get messageAccepted => 'message_accepted'.tr; // 已同意您的好友申请
   static String get messageRejected => 'message_rejected'.tr; // 已拒绝您的好友申请
   static String get messageRejected => 'message_rejected'.tr; // 已拒绝您的好友申请
   static String get messageDeleteYour => 'message_delete_your'.tr; // 您的好友删除了你
   static String get messageDeleteYour => 'message_delete_your'.tr; // 您的好友删除了你
   static String get messageNoData => 'message_no_data'.tr; // 暂无消息
   static String get messageNoData => 'message_no_data'.tr; // 暂无消息
-  static String get messageNewFriendTitle =>
-      'message_new_friend_title'.tr; // 新的好友
+  static String get messageNewFriendTitle => 'message_new_friend_title'.tr; // 新的好友
   static String get messageFriendRefuse => 'message_friend_refuse'.tr; // 拒绝
   static String get messageFriendRefuse => 'message_friend_refuse'.tr; // 拒绝
   static String get messageFriendAgree => 'message_friend_agree'.tr; // 同意
   static String get messageFriendAgree => 'message_friend_agree'.tr; // 同意
-  static String get messageFriendRequestRejected =>
-      'message_friend_request_rejected'.tr; // 好友请求已拒绝
-  static String get messageFriendRequestAgreed =>
-      'message_friend_request_agreed'.tr; // 好友请求已同意
+  static String get messageFriendRequestRejected => 'message_friend_request_rejected'.tr; // 好友请求已拒绝
+  static String get messageFriendRequestAgreed => 'message_friend_request_agreed'.tr; // 好友请求已同意
   static String get urgentContactTitle => 'urgent_contact_title'.tr; // 添加紧急联系人
   static String get urgentContactTitle => 'urgent_contact_title'.tr; // 添加紧急联系人
-  static String get urgentContactBtnTxt =>
-      'urgent_contact_btn_txt'.tr; // 添加紧急联系人
-  static String get urgentContactOnceClickHelp =>
-      'urgent_contact_once_click_help'.tr; // 使用一键求助
-  static String get urgentContactOnceClickHelpDesc =>
-      'urgent_contact_once_click_help_desc'
-          .tr; // 需要添加正确的紧急联系人手机号码,您的联系人将会收到短信以及APP消息通知
-  static String get messageAddFriendSureContent =>
-      'message_add_friend_sure_content'
-          .tr; // 1.您同意添加该用户为好友,则视为您同意本应用合法收集储存和使用信息。\n2.并同意将您的位置、轨迹等信息分享给该好友。
-  static String get urgentContactHasBeenAdded =>
-      'urgent_contact_has_been_added'.tr; // 对方已是您的紧急联系人
-  static String get urgentContactAddDesc =>
-      'urgent_contact_add_desc'.tr; // 紧急情况,快速求助
-  static String get urgentContactAddSuccess =>
-      'urgent_contact_add_success'.tr; // 添加成功
-  static String get urgentContactSubtitle =>
-      'urgent_contact_subtitle'.tr; // 紧急联系人
-  static String get urgentContactDefaultSelected =>
-      'urgent_contact_default_selected'.tr; // 默认
-  static String get urgentContactSendHelp =>
-      'urgent_contact_send_help'.tr; // 一键发送求助
-  static String get urgentContactSetDefault =>
-      'urgent_contact_set_default'.tr; // 设为默认
-  static String get urgentContactCancelDefault =>
-      'urgent_contact_cancel_default'.tr; // 取消默认
-  static String get urgentContactSetDelete =>
-      'urgent_contact_set_delete'.tr; // 删除
-  static String get urgentContactSetSuccess =>
-      'urgent_contact_set_success'.tr; // 设置成功
-  static String get urgentContactCancelSuccess =>
-      'urgent_contact_cancel_success'.tr; // 取消成功
-  static String get urgentContactDeleteSuccess =>
-      'urgent_contact_delete_success'.tr; // 删除成功
-  static String get urgentContactSendAllHelp =>
-      'urgent_contact_send_all_help'.tr; // 确认向您所有好友发送短信求助?
-  static String get urgentContactEmergencyHelp =>
-      'urgent_contact_emergency_help'.tr; // 紧急求助
-  static String get urgentContactAddSelf =>
-      'urgent_contact_add_self'.tr; // 不能添加自己为紧急联系人
+  static String get urgentContactBtnTxt => 'urgent_contact_btn_txt'.tr; // 添加紧急联系人
+  static String get urgentContactOnceClickHelp => 'urgent_contact_once_click_help'.tr; // 使用一键求助
+  static String get urgentContactOnceClickHelpDesc => 'urgent_contact_once_click_help_desc'.tr; // 需要添加正确的紧急联系人手机号码,您的联系人将会收到短信以及APP消息通知
+  static String get messageAddFriendSureContent => 'message_add_friend_sure_content'.tr; // 1.您同意添加该用户为好友,则视为您同意本应用合法收集储存和使用信息。\n2.并同意将您的位置、轨迹等信息分享给该好友。
+  static String get urgentContactHasBeenAdded => 'urgent_contact_has_been_added'.tr; // 对方已是您的紧急联系人
+  static String get urgentContactAddDesc => 'urgent_contact_add_desc'.tr; // 紧急情况,快速求助
+  static String get urgentContactAddSuccess => 'urgent_contact_add_success'.tr; // 添加成功
+  static String get urgentContactSubtitle => 'urgent_contact_subtitle'.tr; // 紧急联系人
+  static String get urgentContactDefaultSelected => 'urgent_contact_default_selected'.tr; // 默认
+  static String get urgentContactSendHelp => 'urgent_contact_send_help'.tr; // 一键发送求助
+  static String get urgentContactSetDefault => 'urgent_contact_set_default'.tr; // 设为默认
+  static String get urgentContactCancelDefault => 'urgent_contact_cancel_default'.tr; // 取消默认
+  static String get urgentContactSetDelete => 'urgent_contact_set_delete'.tr; // 删除
+  static String get urgentContactSetSuccess => 'urgent_contact_set_success'.tr; // 设置成功
+  static String get urgentContactCancelSuccess => 'urgent_contact_cancel_success'.tr; // 取消成功
+  static String get urgentContactDeleteSuccess => 'urgent_contact_delete_success'.tr; // 删除成功
+  static String get urgentContactSendAllHelp => 'urgent_contact_send_all_help'.tr; // 确认向您所有好友发送短信求助?
+  static String get urgentContactEmergencyHelp => 'urgent_contact_emergency_help'.tr; // 紧急求助
+  static String get urgentContactAddSelf => 'urgent_contact_add_self'.tr; // 不能添加自己为紧急联系人
   static String get contactNoDefault => 'contact_no_default'.tr; // 未设置默认紧急联系人
   static String get contactNoDefault => 'contact_no_default'.tr; // 未设置默认紧急联系人
-  static String get urgentContactHelpSendSuccess =>
-      'urgent_contact_help_send_success'.tr; // 已成功发送求助信息
-  static String get urgentContactAddMaxTip =>
-      'urgent_contact_add_max_tip'.tr; // 最多添加5人,请移除后再添加
-  static String get urgentContactEmsSendFail =>
-      'urgent_contact_ems_send_fail'.tr; // 短信发送失败,请稍后重试
-  static String get urgentContactEmsSendPartFail =>
-      'urgent_contact_ems_send_part_fail'.tr; // 部分号码发送失败
+  static String get urgentContactHelpSendSuccess => 'urgent_contact_help_send_success'.tr; // 已成功发送求助信息
+  static String get urgentContactAddMaxTip => 'urgent_contact_add_max_tip'.tr; // 最多添加5人,请移除后再添加
+  static String get urgentContactEmsSendFail => 'urgent_contact_ems_send_fail'.tr; // 短信发送失败,请稍后重试
+  static String get urgentContactEmsSendPartFail => 'urgent_contact_ems_send_part_fail'.tr; // 部分号码发送失败
   static String get feedBack => 'feed_back'.tr; // 用户反馈
   static String get feedBack => 'feed_back'.tr; // 用户反馈
   static String get feedBackTitle => 'feed_back_title'.tr; // 意见或建议:
   static String get feedBackTitle => 'feed_back_title'.tr; // 意见或建议:
   static String get feedBackHint => 'feed_back_hint'.tr; // 请详细描述您的问题
   static String get feedBackHint => 'feed_back_hint'.tr; // 请详细描述您的问题
   static String get feedBackSubmitTxt => 'feed_back_submit_txt'.tr; // 提 交
   static String get feedBackSubmitTxt => 'feed_back_submit_txt'.tr; // 提 交
-  static String get feedBackCustomerService =>
-      'feed_back_customer_service'.tr; // 联系客服
+  static String get feedBackCustomerService => 'feed_back_customer_service'.tr; // 联系客服
   static String get feedBackSuccess => 'feed_back_success'.tr; // 提交成功,感谢您的反馈!
   static String get feedBackSuccess => 'feed_back_success'.tr; // 提交成功,感谢您的反馈!
-  static String get logoutAccountContent => 'logout_account_content'
-      .tr; // 1.删除账号所有账号信息数据和定位记录;\n2.删除并放弃账号下的会员权益;\n3.点击“确认注销”即开始注销流程不可撤回,请慎重考虑。
+  static String get logoutAccountContent => 'logout_account_content'.tr; // 1.删除账号所有账号信息数据和定位记录;\n2.删除并放弃账号下的会员权益;\n3.点击“确认注销”即开始注销流程不可撤回,请慎重考虑。
   static String get logoutAccount => 'logout_account'.tr; // 注销账号
   static String get logoutAccount => 'logout_account'.tr; // 注销账号
   static String get accountLogoutSuccess => 'account_logout_success'.tr; // 注销成功
   static String get accountLogoutSuccess => 'account_logout_success'.tr; // 注销成功
-  static String get recordNumber =>
-      'record_number'.tr; // 备案号:皖ICP备2024057362号-19A
+  static String get recordNumber => 'record_number'.tr; // 备案号:皖ICP备2024057362号-19A
   static String get permissionSetting => 'permission_setting'.tr; // 快速设置
   static String get permissionSetting => 'permission_setting'.tr; // 快速设置
-  static String get permissionLocationSetting =>
-      'permission_location_setting'.tr; // 定位权限开启
-  static String get permissionLocationSettingSubtitle =>
-      'permission_location_setting_subtitle'
-          .tr; // 定位权限需要设置为本应用选择“始终允许”,才可以正常查看轨迹。
-  static String get permissionBatteryOptimization =>
-      'permission_battery_optimization'.tr; // 电池优化白名单
-  static String get permissionBatteryOptimizationSubtitle =>
-      'permission_battery_optimization_subtitle'
-          .tr; // 系统可能会为了省电,关闭后台的应用,避免出现轨迹异常,需要将本应用加入保护名单。
-  static String get permissionBackgroundOperation =>
-      'permission_background_operation'.tr; // 后台运行权限
-  static String get permissionBackgroundOperationSubtitle =>
-      'permission_background_operation_subtitle'
-          .tr; // 将本应用加入后台权限名单,可以一定程度保护app在后台正常运行。
-  static String get permissionSettingSuccess =>
-      'permission_setting_success'.tr; // 设置成功
-  static String get memberFreeCodeErrorToast =>
-      'member_free_code_error_toast'.tr; // 每位用户只能领取一次试用
-  static String get memberFreeCodeIsmember =>
-      'member_free_code_is_member'.tr; // 您已经是会员了
-  static String get memberEquityIntroduction =>
-      'member_equity_introduction'.tr; // 会员尊享以下特权
+  static String get permissionLocationSetting => 'permission_location_setting'.tr; // 定位权限开启
+  static String get permissionLocationSettingSubtitle => 'permission_location_setting_subtitle'.tr; // 定位权限需要设置为本应用选择“始终允许”,才可以正常查看轨迹。
+  static String get permissionBatteryOptimization => 'permission_battery_optimization'.tr; // 电池优化白名单
+  static String get permissionBatteryOptimizationSubtitle => 'permission_battery_optimization_subtitle'.tr; // 系统可能会为了省电,关闭后台的应用,避免出现轨迹异常,需要将本应用加入保护名单。
+  static String get permissionBackgroundOperation => 'permission_background_operation'.tr; // 后台运行权限
+  static String get permissionBackgroundOperationSubtitle => 'permission_background_operation_subtitle'.tr; // 将本应用加入后台权限名单,可以一定程度保护app在后台正常运行。
+  static String get permissionSettingSuccess => 'permission_setting_success'.tr; // 设置成功
+  static String get memberFreeCodeErrorToast => 'member_free_code_error_toast'.tr; // 每位用户只能领取一次试用
+  static String get memberFreeCodeIsmember => 'member_free_code_is_member'.tr; // 您已经是会员了
+  static String get memberEquityIntroduction => 'member_equity_introduction'.tr; // 会员尊享以下特权
   static String get memberFunName1 => 'member_fun_name_1'.tr; // 实时定位
   static String get memberFunName1 => 'member_fun_name_1'.tr; // 实时定位
   static String get memberFunName1Desc => 'member_fun_name_1_desc'.tr; // 定位实时共享
   static String get memberFunName1Desc => 'member_fun_name_1_desc'.tr; // 定位实时共享
   static String get memberFunName2 => 'member_fun_name_2'.tr; // 情侣守护
   static String get memberFunName2 => 'member_fun_name_2'.tr; // 情侣守护
@@ -317,13 +225,10 @@ class StringName {
   static String get memberFunName6 => 'member_fun_name_6'.tr; // 紧急求助
   static String get memberFunName6 => 'member_fun_name_6'.tr; // 紧急求助
   static String get memberFunName6Desc => 'member_fun_name_6_desc'.tr; // 一对一服务
   static String get memberFunName6Desc => 'member_fun_name_6_desc'.tr; // 一对一服务
   static String get memberUserEvaluate => 'member_user_evaluate'.tr; // 用户评价
   static String get memberUserEvaluate => 'member_user_evaluate'.tr; // 用户评价
-  static String get memberTips => 'member_tips'
-      .tr; // 本应用功能仅限于家庭成员和亲人朋友之间使用,根据相关法规和隐私协议规定,共享位置功能需要对方下载得到好友授权同意才能正常使用。
+  static String get memberTips => 'member_tips'.tr; // 本应用功能仅限于家庭成员和亲人朋友之间使用,根据相关法规和隐私协议规定,共享位置功能需要对方下载得到好友授权同意才能正常使用。
   static String get memberContinuePay => 'member_continue_pay'.tr; // 继续支付
   static String get memberContinuePay => 'member_continue_pay'.tr; // 继续支付
-  static String get memberPleaseChoiceGoods =>
-      'member_please_choice_goods'.tr; // 请选择支付商品
-  static String get memberPleaseChoicePayment =>
-      'member_please_choice_payment'.tr; // 请选择支付方式
+  static String get memberPleaseChoiceGoods => 'member_please_choice_goods'.tr; // 请选择支付商品
+  static String get memberPleaseChoicePayment => 'member_please_choice_payment'.tr; // 请选择支付方式
   static String get payLoading => 'pay_loading'.tr; // 请求中...
   static String get payLoading => 'pay_loading'.tr; // 请求中...
   static String get payUserCancel => 'pay_user_cancel'.tr; // 用户取消支付
   static String get payUserCancel => 'pay_user_cancel'.tr; // 用户取消支付
   static String get payNotSupport => 'pay_not_support'.tr; // 不支持该支付类型
   static String get payNotSupport => 'pay_not_support'.tr; // 不支持该支付类型
@@ -335,30 +240,20 @@ class StringName {
   static String get paySuccessDesc => 'pay_success_desc'.tr; // 您的订单已成功支付
   static String get paySuccessDesc => 'pay_success_desc'.tr; // 您的订单已成功支付
   static String get alipayQrCodeTips => 'alipay_qr_code_tips'.tr; // 请使用支付宝扫码支付
   static String get alipayQrCodeTips => 'alipay_qr_code_tips'.tr; // 请使用支付宝扫码支付
   static String get wechatQrCodeTips => 'wechat_qr_code_tips'.tr; // 请使用微信扫码支付
   static String get wechatQrCodeTips => 'wechat_qr_code_tips'.tr; // 请使用微信扫码支付
-  static String get wechatPayQrCodeTips =>
-      'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
-  static String get memberPaymentFailed =>
-      'member_payment_failed'.tr; // 开通失败,请稍后重试
+  static String get wechatPayQrCodeTips => 'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
+  static String get memberPaymentFailed => 'member_payment_failed'.tr; // 开通失败,请稍后重试
   static String get exitAppTip => 'exit_app_tip'.tr; // 再按一次退出应用
   static String get exitAppTip => 'exit_app_tip'.tr; // 再按一次退出应用
   static String get traceDetail => 'trace_detail'.tr; // 轨迹详情
   static String get traceDetail => 'trace_detail'.tr; // 轨迹详情
-  static String get traceDetailSearchHint =>
-      'trace_detail_search_hint'.tr; // 查找地址
+  static String get traceDetailSearchHint => 'trace_detail_search_hint'.tr; // 查找地址
   static String get traceDetailTitle => 'trace_detail_title'.tr; // Ta的线路轨迹
   static String get traceDetailTitle => 'trace_detail_title'.tr; // Ta的线路轨迹
-  static String get urgentContactHelpSendTooFast =>
-      'urgent_contact_help_send_too_fast'.tr; // 请求发送频繁,请稍后重试
-  static String get dialogLocationPermissionTips =>
-      'dialog_location_permission_tips'.tr; // 位置权限使用说明,使用地图和定位功能需要获取“定位权限”
-  static String get dialogLocationPermissionConfirmTxt =>
-      'dialog_location_permission_confirm_txt'.tr; // 去定位
-  static String get dialogLocationAlwaysPermissionTitle =>
-      'dialog_location_always_permission_title'.tr; // 允许定位权限
-  static String get dialogLocationAlwaysPermissionConfirmTxt =>
-      'dialog_location_always_permission_confirm_txt'.tr; // 去设置
-  static String get appleRecoverSubscribeTxt =>
-      'apple_recover_subscribe_txt'.tr; // 恢复订阅
+  static String get urgentContactHelpSendTooFast => 'urgent_contact_help_send_too_fast'.tr; // 请求发送频繁,请稍后重试
+  static String get dialogLocationPermissionTips => 'dialog_location_permission_tips'.tr; // 位置权限使用说明,使用地图和定位功能需要获取“定位权限”
+  static String get dialogLocationPermissionConfirmTxt => 'dialog_location_permission_confirm_txt'.tr; // 去定位
+  static String get dialogLocationAlwaysPermissionTitle => 'dialog_location_always_permission_title'.tr; // 允许定位权限
+  static String get dialogLocationAlwaysPermissionConfirmTxt => 'dialog_location_always_permission_confirm_txt'.tr; // 去设置
+  static String get appleRecoverSubscribeTxt => 'apple_recover_subscribe_txt'.tr; // 恢复订阅
   static String get dialogNetErrorTitle => 'dialog_net_error_title'.tr; // 网络已断开
   static String get dialogNetErrorTitle => 'dialog_net_error_title'.tr; // 网络已断开
-  static String get dialogNetErrorDesc =>
-      'dialog_net_error_desc'.tr; // 请检查您的网络连接并重试
+  static String get dialogNetErrorDesc => 'dialog_net_error_desc'.tr; // 请检查您的网络连接并重试
   static String get dialogNetErrorAgain => 'dialog_net_error_again'.tr; // 重试
   static String get dialogNetErrorAgain => 'dialog_net_error_again'.tr; // 重试
 }
 }
 class StringMultiSource {
 class StringMultiSource {
@@ -412,6 +307,9 @@ class StringMultiSource {
       'member_vip_permanent': '永久会员',
       'member_vip_permanent': '永久会员',
       'member_experience_vip': '免费VIP体验礼包',
       'member_experience_vip': '免费VIP体验礼包',
       'member_experience_vip_receive': '去领取',
       'member_experience_vip_receive': '去领取',
+      'member_trial_has_expired': '会员试用已过期',
+      'member_countdown_remaining': '剩余',
+      'member_countdown_experience_time': '体验时间',
       'mine_urgent_contact': '紧急联系人',
       'mine_urgent_contact': '紧急联系人',
       'mine_fun_share': '邀请好友',
       'mine_fun_share': '邀请好友',
       'mine_fun_customer_service': '专属客服',
       'mine_fun_customer_service': '专属客服',

File diff suppressed because it is too large
+ 212 - 164
pubspec.lock