From a3f8db991d4a7bc876e0223912d647664ab3903a Mon Sep 17 00:00:00 2001 From: roxy Date: Mon, 27 Apr 2026 14:56:56 +0800 Subject: [PATCH] =?UTF-8?q?h5=E8=A1=A5token=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room_game/views/baishun_game_page.dart | 4 +- .../room_game/views/leader_game_page.dart | 4 +- lib/modules/webview/webview_page.dart | 8 +-- lib/shared/tools/sc_banner_utils.dart | 16 +---- lib/shared/tools/sc_h5_url_utils.dart | 60 +++++++++++++++++++ 5 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 lib/shared/tools/sc_h5_url_utils.dart diff --git a/lib/modules/room_game/views/baishun_game_page.dart b/lib/modules/room_game/views/baishun_game_page.dart index 909fc1f..c89c5bc 100644 --- a/lib/modules/room_game/views/baishun_game_page.dart +++ b/lib/modules/room_game/views/baishun_game_page.dart @@ -14,6 +14,7 @@ import 'package:yumi/modules/room_game/data/room_game_repository.dart'; import 'package:yumi/modules/room_game/utils/room_game_viewport.dart'; import 'package:yumi/modules/room_game/views/baishun_loading_view.dart'; import 'package:yumi/modules/wallet/wallet_route.dart'; +import 'package:yumi/shared/tools/sc_h5_url_utils.dart'; import 'package:yumi/ui_kit/components/sc_tts.dart'; class BaishunGamePage extends StatefulWidget { @@ -216,7 +217,8 @@ class _BaishunGamePageState extends State { return; } - final uri = Uri.tryParse(entryUrl); + final h5Url = SCH5UrlUtils.appendToken(entryUrl); + final uri = Uri.tryParse(h5Url); if (uri == null) { throw Exception('Invalid game entry url: $entryUrl'); } diff --git a/lib/modules/room_game/views/leader_game_page.dart b/lib/modules/room_game/views/leader_game_page.dart index 07f3027..0f22bba 100644 --- a/lib/modules/room_game/views/leader_game_page.dart +++ b/lib/modules/room_game/views/leader_game_page.dart @@ -13,6 +13,7 @@ import 'package:yumi/modules/room_game/data/room_game_repository.dart'; import 'package:yumi/modules/room_game/utils/room_game_viewport.dart'; import 'package:yumi/modules/room_game/views/baishun_loading_view.dart'; import 'package:yumi/modules/wallet/wallet_route.dart'; +import 'package:yumi/shared/tools/sc_h5_url_utils.dart'; import 'package:yumi/ui_kit/components/sc_tts.dart'; class LeaderGamePage extends StatefulWidget { @@ -189,7 +190,8 @@ class _LeaderGamePageState extends State { await _controller.loadHtmlString(_buildMockHtml()); return; } - final uri = Uri.tryParse(entryUrl); + final h5Url = SCH5UrlUtils.appendToken(entryUrl); + final uri = Uri.tryParse(h5Url); if (uri == null) { throw Exception('Invalid game entry url: $entryUrl'); } diff --git a/lib/modules/webview/webview_page.dart b/lib/modules/webview/webview_page.dart index dc09675..c15ec50 100644 --- a/lib/modules/webview/webview_page.dart +++ b/lib/modules/webview/webview_page.dart @@ -12,6 +12,7 @@ import 'package:yumi/app/constants/sc_global_config.dart'; import 'package:yumi/app/constants/sc_screen.dart'; import 'package:yumi/app/routes/sc_fluro_navigator.dart'; import 'package:yumi/shared/tools/sc_deviceId_utils.dart'; +import 'package:yumi/shared/tools/sc_h5_url_utils.dart'; import 'package:yumi/shared/tools/sc_room_utils.dart'; import 'package:yumi/shared/tools/sc_url_launcher_utils.dart'; import 'package:yumi/main.dart'; @@ -46,12 +47,7 @@ class _WebViewPageState extends State { @override void initState() { super.initState(); - if (widget.url.split("?").length > 1) { - urlLink = "${widget.url}&"; - } else { - urlLink = "${widget.url}?"; - } - urlLink = "${urlLink}lang=${SCGlobalConfig.lang}"; + urlLink = SCH5UrlUtils.appendAppParams(widget.url); // 初始化 WebViewController _controller = WebViewController() diff --git a/lib/shared/tools/sc_banner_utils.dart b/lib/shared/tools/sc_banner_utils.dart index 16f1d2a..48f0258 100644 --- a/lib/shared/tools/sc_banner_utils.dart +++ b/lib/shared/tools/sc_banner_utils.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; import 'package:yumi/shared/tools/sc_room_utils.dart'; import 'package:yumi/shared/tools/sc_string_utils.dart'; +import 'package:yumi/shared/tools/sc_h5_url_utils.dart'; import 'package:yumi/shared/tools/sc_url_launcher_utils.dart'; import 'package:yumi/shared/business_logic/models/res/sc_index_banner_res.dart'; import 'package:yumi/modules/index/main_route.dart'; import 'package:yumi/app/routes/sc_fluro_navigator.dart'; -import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import '../../shared/data_sources/models/enum/sc_banner_open_type.dart'; @@ -47,18 +47,6 @@ class SCBannerUtils { } static String _appendToken(String url) { - final token = AccountStorage().getToken(); - if (token.isEmpty) { - return url; - } - - final uri = Uri.tryParse(url); - if (uri == null) { - return url; - } - - final queryParameters = Map.from(uri.queryParameters); - queryParameters['token'] = token; - return uri.replace(queryParameters: queryParameters).toString(); + return SCH5UrlUtils.appendToken(url); } } diff --git a/lib/shared/tools/sc_h5_url_utils.dart b/lib/shared/tools/sc_h5_url_utils.dart new file mode 100644 index 0000000..b9b0d17 --- /dev/null +++ b/lib/shared/tools/sc_h5_url_utils.dart @@ -0,0 +1,60 @@ +import 'package:yumi/app/constants/sc_global_config.dart'; +import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; + +class SCH5UrlUtils { + static String appendAppParams(String url) { + return _appendQueryParams(url, appendLang: true, appendToken: true); + } + + static String appendToken(String url) { + return _appendQueryParams(url, appendLang: false, appendToken: true); + } + + static String _appendQueryParams( + String url, { + required bool appendLang, + required bool appendToken, + }) { + final trimmedUrl = url.trim(); + if (trimmedUrl.isEmpty) { + return url; + } + + final uri = Uri.tryParse(trimmedUrl); + if (uri == null) { + return url; + } + + final queryParameters = {}; + uri.queryParametersAll.forEach((key, values) { + queryParameters[key] = List.from(values); + }); + + var hasChanges = false; + if (appendLang && !_hasQueryKey(queryParameters, 'lang')) { + queryParameters['lang'] = SCGlobalConfig.lang; + hasChanges = true; + } + + final token = AccountStorage().getToken(); + if (appendToken && + token.isNotEmpty && + !_hasQueryKey(queryParameters, 'token')) { + queryParameters['token'] = token; + hasChanges = true; + } + + if (!hasChanges) { + return url; + } + + return uri.replace(queryParameters: queryParameters).toString(); + } + + static bool _hasQueryKey(Map queryParameters, String key) { + final lowerKey = key.toLowerCase(); + return queryParameters.keys.any( + (queryKey) => queryKey.toLowerCase() == lowerKey, + ); + } +}