5 Commits

Author SHA1 Message Date
a497bc6469 清理插件 2026-03-19 17:41:28 +08:00
3f282d15c1 协议修改 2026-03-19 16:37:57 +08:00
03b35f660c 协议前置 2026-03-19 14:41:32 +08:00
9b6f93ca95 隐私调整 2026-03-17 13:31:58 +08:00
eb41ecaec4 更新插件 2026-03-16 16:00:38 +08:00
10 changed files with 204 additions and 80 deletions

View File

@@ -61,48 +61,6 @@
<meta-data
android:name="com.alibaba.app.appsecret"
android:value="39628204345a4240b5b645b68a5896c7" />
<!-- 华为通道的参数appid -->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="" />
<!-- vivo通道的参数api_key为appkey -->
<meta-data
android:name="com.vivo.push.api_key"
android:value="" />
<meta-data
android:name="com.vivo.push.app_id"
android:value="" />
<!-- honor通道的参数-->
<meta-data
android:name="com.hihonor.push.app_id"
android:value="" />
<!-- oppo -->
<meta-data
android:name="com.oppo.push.key"
android:value="" />
<meta-data
android:name="com.oppo.push.secret"
android:value="" />
<!-- 小米-->
<meta-data
android:name="com.xiaomi.push.id"
android:value="id=2222222222222222222" />
<meta-data
android:name="com.xiaomi.push.key"
android:value="id=5555555555555" />
<!-- 魅族-->
<meta-data
android:name="com.meizu.push.id"
android:value="" />
<meta-data
android:name="com.meizu.push.key"
android:value="" />
<!-- 接收推送消息 -->
<receiver

View File

@@ -21,9 +21,7 @@
.amap-callamap,
.amap-lib-driving-callBtn,
.amap-copyright,
.amap-logo {
display: none !important;
}
.amap-logo{bottom: 60px}
/* 去除高德默认的 label 边框 and 背景 */
.amap-marker-label {

View File

@@ -1,7 +1,7 @@
PODS:
- AlicloudELS (1.0.3)
- AlicloudPush (3.2.3):
- AlicloudELS (= 1.0.3)
- AlicloudELS (~> 1.0.3)
- AlicloudUTDID (~> 1.0)
- AlicloudUTDID (1.6.1)
- aliyun_push_flutter (0.0.1):
@@ -115,11 +115,11 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
AlicloudELS: fbf821383330465a5af84a033f36f263ae46ca41
AlicloudPush: 95150880af380f64cf1741f5586047c17d36c1d9
AlicloudPush: 52cbf38ffc20c07f039cbc72d5738745fd986215
AlicloudUTDID: 5d2f22d50e11eecd38f30bc7a48c71925ea90976
aliyun_push_flutter: 0fc2f048a08687ef256c0cfdd72dd7a550ef3347
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99

View File

@@ -1,9 +1,13 @@
import 'dart:io';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/login_util.dart';
import 'package:ln_jq_app/pages/b_page/reservation/controller.dart';
import 'package:ln_jq_app/pages/c_page/message/view.dart';
import 'package:ln_jq_app/pages/common/webview/view.dart';
class ReservationPage extends GetView<ReservationController> {
const ReservationPage({super.key});
@@ -36,6 +40,30 @@ class ReservationPage extends GetView<ReservationController> {
_buildSystemTips(),
SizedBox(height: 24),
_buildLogoutButton(),
SizedBox(height: 15.h),
Text.rich(
TextSpan(
style: const TextStyle(color: Colors.grey, fontSize: 13),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("用户协议", "https://lnh2e.com/user_agreement.html");
},
),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html");
},
),
],
),
),
SizedBox(height: 95.h),
],
),
@@ -48,6 +76,14 @@ class ReservationPage extends GetView<ReservationController> {
);
}
void openPage(String title, String url) {
if (Platform.isIOS) {
openWebPage(url);
return;
}
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
/// 1. 顶部个人信息及统计栏
Widget _buildTopSection(BuildContext context) {
return Container(

View File

@@ -1,10 +1,15 @@
import 'dart:io';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:getx_scaffold/common/index.dart';
import 'package:getx_scaffold/common/widgets/index.dart';
import 'package:ln_jq_app/common/login_util.dart';
import 'package:ln_jq_app/common/styles/theme.dart';
import 'package:ln_jq_app/pages/c_page/message/view.dart';
import 'package:ln_jq_app/pages/common/webview/view.dart';
import 'package:ln_jq_app/storage_service.dart';
import 'controller.dart';
@@ -38,6 +43,30 @@ class MinePage extends GetView<MineController> {
_buildSafetyReminderCard(),
SizedBox(height: 24.h),
_buildLogoutButton(),
SizedBox(height: 15.h),
Text.rich(
TextSpan(
style: const TextStyle(color: Colors.grey, fontSize: 13),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("用户协议", "https://lnh2e.com/user_agreement.html");
},
),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html");
},
),
],
),
),
SizedBox(height: 95.h),
],
),
@@ -51,6 +80,15 @@ class MinePage extends GetView<MineController> {
);
}
void openPage(String title, String url) {
if (Platform.isIOS) {
openWebPage(url);
return;
}
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
/// 构建顶部用户信息卡片
Widget _buildUserInfoCard() {
return Card(

View File

@@ -29,14 +29,6 @@ class HomeController extends GetxController with BaseControllerMixin {
@override
void onInit() {
super.onInit();
// 检查是否同意过隐私政策,只有同意后才初始化推送
if (StorageService.to.isPrivacyAgreed) {
requestPermission();
initAliyunPush();
addPushCallback();
}
FlutterNativeSplash.remove();
log('page-init');
@@ -159,6 +151,13 @@ class HomeController extends GetxController with BaseControllerMixin {
// 根据登录状态和登录渠道返回不同的首页
Widget getHomePage() {
if (StorageService.to.isLoggedIn) {
// 检查是否同意过隐私政策,只有同意后才初始化推送
if (StorageService.to.isPrivacyAgreed) {
requestPermission();
initAliyunPush();
addPushCallback();
}
if (StorageService.to.loginChannel == LoginChannel.station) {
return B_BaseWidgetsPage();
} else if (StorageService.to.loginChannel == LoginChannel.driver) {

View File

@@ -140,9 +140,29 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
children: [
const SizedBox(height: 30),
// 根据 Tab 显示不同的输入框
_tabController.index == 0
!_isAgreed
? GestureDetector(
onTap: () => _handleLogin(controller),
behavior: HitTestBehavior.opaque,
child: Container(
width: double.infinity,
height: 55.h,
padding: const EdgeInsets.symmetric(
horizontal: 24,
),
alignment: Alignment.centerLeft,
child: Text(
"请先阅读并同意用户协议和隐私政策",
style: TextStyle(
color: Colors.grey,
fontSize: 16,
),
),
),
)
: (_tabController.index == 0
? _buildDriverInputFields(controller)
: _buildStationInputFields(controller),
: _buildStationInputFields(controller)),
const SizedBox(height: 30),
// 统一登录按钮
@@ -150,7 +170,8 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
const SizedBox(height: 10),
buildAgreement(),
const SizedBox(height: 40),
const SizedBox(height: 80),
_buildFooterSlogan(),
],
),
),
@@ -159,7 +180,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
),
),
),
Positioned(left: 0, right: 0, bottom: 33.h, child: _buildFooterSlogan()),
if (AppTheme.is_show_host)
Positioned(
top: 40.h,
@@ -475,7 +495,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
}
}
_processLoginResponse(responseData, "station", account);
} catch (e) {
dismissLoading();
@@ -539,7 +558,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
Logger.d("暂时不处理 查询车辆信息失败的情况");
}
dismissLoading();
Get.offAll(() => BaseWidgetsPage());
} else {
@@ -596,9 +614,7 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
}
// 添加推送回调
_aliyunPush.addMessageReceiver(
onNotificationOpened: _onNotificationOpened,
);
_aliyunPush.addMessageReceiver(onNotificationOpened: _onNotificationOpened);
isPushInitialized = true;
Logger.d('推送服务初始化成功');

View File

@@ -1,16 +1,103 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:get/get.dart';
import 'package:getx_scaffold/common/components/index.dart';
import 'package:getx_scaffold/common/widgets/rich_text_x.dart';
import 'package:ln_jq_app/pages/home/view.dart';
import 'package:ln_jq_app/pages/login/view.dart';
import 'package:ln_jq_app/storage_service.dart';
import '../common/webview/view.dart';
class WelcomeController extends GetxController {
@override
void onReady() {
super.onReady();
// 移除原生闪屏页(如果有的话)
FlutterNativeSplash.remove();
_startTimer();
if (Platform.isAndroid) {
if (StorageService.to.isPrivacyAgreed) {
_startTimer();
} else {
showPrivacyDialog();
}
} else if (Platform.isIOS) {
_startTimer();
}
}
void showPrivacyDialog() {
DialogX.to.showConfirmDialog(
title: "个人信息保护提示",
content: _buildDialogContent(),
confirmText: '同意',
cancelText: '不同意',
onConfirm: () async {
await StorageService.to.savePrivacyAgreed(true);
Get.offAll(() => const HomePage());
},
onCancel: () {
DialogX.to.showConfirmDialog(
title: "温馨提示",
content: RichTextX(
children: [
TextSpanItem('如果您不同意'),
TextSpanItem(
'《隐私协议》',
onTap: () => openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html"),
),
TextSpanItem(''),
TextSpanItem(
'《用户政策》',
onTap: () => openPage("用户协议", "https://lnh2e.com/user_agreement.html"),
),
TextSpanItem(
',很遗憾我们将无法为您提供服务。您需要同意以上协议后,才能使用本应用。\n\n我们将严格按照相关法律法规要求,坚决保护您的个人隐私和信息安全。',
),
TextSpanItem('\n点击“同意”按钮,表示您已知情并同意以上协议。'),
],
),
confirmText: '同意并继续',
cancelText: '不同意',
onConfirm: () async {
await StorageService.to.savePrivacyAgreed(true);
Get.offAll(() => const HomePage());
},
onCancel: () {
SystemNavigator.pop();
},
);
},
);
}
Widget _buildDialogContent() {
return RichTextX(
children: [
TextSpanItem('欢迎使用小羚羚!\n我们将通过'),
TextSpanItem(
'《隐私协议》',
onTap: () => openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html"),
),
TextSpanItem(''),
TextSpanItem(
'《用户政策》',
onTap: () => openPage("用户协议", "https://lnh2e.com/user_agreement.html"),
),
TextSpanItem(
',帮助您了解我们为您提供的服务、我们如何处理个人信息以及您享有的权利。我们会严格按照相关法律法规要求,采取各种安全措施来保护您的个人信息。',
),
TextSpanItem('\n点击“同意”按钮,表示您已知情并同意以上协议。'),
],
);
}
void openPage(String title, String url) {
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
void _startTimer() {

View File

@@ -162,13 +162,13 @@ packages:
source: hosted
version: "3.2.4"
device_info_plus:
dependency: transitive
dependency: "direct overridden"
description:
name: device_info_plus
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "10.1.2"
version: "12.3.0"
device_info_plus_platform_interface:
dependency: transitive
description:
@@ -741,14 +741,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
mobile_scanner:
dependency: "direct main"
description:
name: mobile_scanner
sha256: c6184bf2913dd66be244108c9c27ca04b01caf726321c44b0e7a7a1e32d41044
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.1.4"
modal_bottom_sheet:
dependency: transitive
description:
@@ -1230,10 +1222,10 @@ packages:
dependency: transitive
description:
name: win32_registry
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.5"
version: "2.1.0"
xdg_directories:
dependency: transitive
description:

View File

@@ -45,7 +45,6 @@ dependencies:
dropdown_button2: ^2.3.8
image_picker: ^1.2.1 # 用于从相册选择图片
image: ^4.5.4
mobile_scanner: ^7.1.4
flutter_pdfview: 1.4.3 #显示pdf
photo_view: ^0.15.0 #操作图片
flutter_inappwebview: ^6.1.5 # WebView插件
@@ -65,6 +64,7 @@ dev_dependencies:
dependency_overrides:
intl: 0.19.0
device_info_plus: ^12.3.0
flutter: