fix(client): 设置页购买入口改为显示套餐(PurchaseScreen)而非兑换/去哪买链接
- 「购买套餐」→ PurchaseScreen(渠道 switch + 三档套餐 + 下单),不再进 RedeemScreen 的引流卡 - bump 1.0.69+70 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
This commit is contained in:
@@ -15,10 +15,11 @@ import '../state/app_providers.dart';
|
|||||||
import '../state/navigation_provider.dart';
|
import '../state/navigation_provider.dart';
|
||||||
import '../state/settings_provider.dart';
|
import '../state/settings_provider.dart';
|
||||||
import '../state/update_provider.dart';
|
import '../state/update_provider.dart';
|
||||||
import '../widgets/account_screens.dart';
|
|
||||||
import '../widgets/pangolin_icons.dart';
|
import '../widgets/pangolin_icons.dart';
|
||||||
import '../widgets/pangolin_toast.dart';
|
import '../widgets/pangolin_toast.dart';
|
||||||
import 'orders_page.dart';
|
import 'orders_page.dart';
|
||||||
|
import 'payment_page.dart';
|
||||||
|
import 'purchase_page.dart';
|
||||||
/// 「检查更新」手动触发:拉取 `$kApiBaseUrl/version`,失败/无更新走轻提示,
|
/// 「检查更新」手动触发:拉取 `$kApiBaseUrl/version`,失败/无更新走轻提示,
|
||||||
/// 有更新则清掉「已忽略版本」→ 顶部更新 banner 显示 + toast(不弹窗)。
|
/// 有更新则清掉「已忽略版本」→ 顶部更新 banner 显示 + toast(不弹窗)。
|
||||||
Future<void> _checkForUpdate(BuildContext context, WidgetRef ref, AppText t) async {
|
Future<void> _checkForUpdate(BuildContext context, WidgetRef ref, AppText t) async {
|
||||||
@@ -70,11 +71,18 @@ class SettingsPage extends ConsumerWidget {
|
|||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: const BoxConstraints(maxWidth: 560),
|
constraints: const BoxConstraints(maxWidth: 560),
|
||||||
child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
|
child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
|
||||||
// 兑换 & 购买 + 我的订单
|
// 购买套餐 + 我的订单
|
||||||
_Card(children: [
|
_Card(children: [
|
||||||
_Row(title: t.redeemEntry, sub: t.proMember,
|
_Row(title: t.purchaseTitle, sub: t.proMember,
|
||||||
right: Icon(PangolinIcons.chevronRight, size: 18, color: c.fg3),
|
right: Icon(PangolinIcons.chevronRight, size: 18, color: c.fg3),
|
||||||
onTap: () => open(NavView.redeem, RedeemScreen(t: t))),
|
onTap: () => open(
|
||||||
|
NavView.purchase,
|
||||||
|
PurchaseScreen(
|
||||||
|
t: t,
|
||||||
|
onOrderCreated: () => Navigator.of(context)
|
||||||
|
.push(MaterialPageRoute(builder: (_) => PaymentScreen(t: t))),
|
||||||
|
),
|
||||||
|
)),
|
||||||
_Row(title: t.ordersTitle, last: true,
|
_Row(title: t.ordersTitle, last: true,
|
||||||
right: Icon(PangolinIcons.chevronRight, size: 18, color: c.fg3),
|
right: Icon(PangolinIcons.chevronRight, size: 18, color: c.fg3),
|
||||||
onTap: () => open(NavView.orders, OrdersScreen(t: t))),
|
onTap: () => open(NavView.orders, OrdersScreen(t: t))),
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
name: pangolin_vpn
|
name: pangolin_vpn
|
||||||
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
|
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 1.0.68+69
|
version: 1.0.69+70
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.5.0
|
sdk: ^3.5.0
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
; 穿山甲 Pangolin Windows 安装包 (Inno Setup 6)
|
|
||||||
; 编译: ISCC.exe pangolin.iss (或用 Inno Setup Compiler 打开)
|
|
||||||
; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在
|
|
||||||
; ..\..\build\windows\x64\runner\Release
|
|
||||||
#define MyAppName "穿山甲 Pangolin"
|
|
||||||
#define MyAppVersion "1.0.68"
|
|
||||||
#define MyAppPublisher "Pangolin"
|
|
||||||
#define MyAppExeName "pangolin_vpn.exe"
|
|
||||||
#define BuildDir "..\..\build\windows\x64\runner\Release"
|
|
||||||
|
|
||||||
[Setup]
|
|
||||||
AppId={{B2F1B0A0-7A3C-4C2E-9E5A-1A2B3C4D5E6F}
|
|
||||||
AppName={#MyAppName}
|
|
||||||
AppVersion={#MyAppVersion}
|
|
||||||
AppPublisher={#MyAppPublisher}
|
|
||||||
DefaultDirName={autopf}\Pangolin
|
|
||||||
DefaultGroupName=Pangolin
|
|
||||||
DisableProgramGroupPage=yes
|
|
||||||
OutputBaseFilename=pangolin-setup-{#MyAppVersion}
|
|
||||||
Compression=lzma2
|
|
||||||
SolidCompression=yes
|
|
||||||
WizardStyle=modern
|
|
||||||
; 安装需管理员(写 Program Files;app 本身 requireAdministrator)
|
|
||||||
PrivilegesRequired=admin
|
|
||||||
ArchitecturesInstallIn64BitMode=x64compatible
|
|
||||||
|
|
||||||
[Languages]
|
|
||||||
; ChineseSimplified.isl 随仓库附带(此 Inno Setup 安装未含官方简中语言包),与本 .iss 同目录
|
|
||||||
Name: "chinesesimplified"; MessagesFile: "ChineseSimplified.isl"
|
|
||||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
||||||
|
|
||||||
[Files]
|
|
||||||
; 整个 Release 目录(含 pangolin_vpn.exe / flutter_windows.dll / data\ /
|
|
||||||
; 插件 dll / sing-box.exe / wintun.dll)
|
|
||||||
Source: "{#BuildDir}\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs ignoreversion
|
|
||||||
|
|
||||||
[Icons]
|
|
||||||
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
|
||||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
|
||||||
|
|
||||||
[Tasks]
|
|
||||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
|
|
||||||
|
|
||||||
[Run]
|
|
||||||
; runascurrentuser:安装包是 admin 提权运行的,默认 postinstall 会降回普通用户身份拉起
|
|
||||||
; app(Inno 的 RunAsOriginalUser)→ requireAdministrator 的 app 起不来/没管理员权,TUN 建不了。
|
|
||||||
; 加此标志用安装包自身的管理员令牌拉起,装完即以管理员运行、不额外弹 UAC。
|
|
||||||
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent runascurrentuser
|
|
||||||
|
|
||||||
[UninstallDelete]
|
|
||||||
; 卸载清理运行期数据(kernel 配置等)
|
|
||||||
Type: filesandordirs; Name: "{localappdata}\Pangolin"
|
|
||||||
|
|
||||||
[Code]
|
|
||||||
{ ── 升级覆盖修复 ──────────────────────────────────────────────────────────
|
|
||||||
历史坑:1.0.0 的 AppId 是非法 GUID(...PANGOLIN0001),1.0.1 起改成当前合法
|
|
||||||
GUID。AppId 不同 → Inno 视为两个独立产品 → 旧版不被覆盖,控制面板里并排两个。
|
|
||||||
当前 AppId 已稳定(1.0.1+ 同源,会原地升级);此处在安装前再把那个遗留 AppId
|
|
||||||
的残留装静默卸掉,清掉已并存的 1.0.0 幽灵,杜绝多版本并排。}
|
|
||||||
const
|
|
||||||
LegacyAppId = '{B2F1B0A0-7A3C-4C2E-9E5A-PANGOLIN0001}_is1';
|
|
||||||
|
|
||||||
function GetUninstallString(const SubKey: string): string;
|
|
||||||
var
|
|
||||||
s: string;
|
|
||||||
begin
|
|
||||||
s := '';
|
|
||||||
if not RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s) then
|
|
||||||
if not RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s) then
|
|
||||||
RegQueryStringValue(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s);
|
|
||||||
Result := s;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure RemoveLegacyVersion;
|
|
||||||
var
|
|
||||||
uninst: string;
|
|
||||||
rc: Integer;
|
|
||||||
begin
|
|
||||||
uninst := GetUninstallString(LegacyAppId);
|
|
||||||
if uninst <> '' then
|
|
||||||
begin
|
|
||||||
uninst := RemoveQuotes(uninst);
|
|
||||||
Exec(uninst, '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART', '', SW_HIDE, ewWaitUntilTerminated, rc);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure CurStepChanged(CurStep: TSetupStep);
|
|
||||||
begin
|
|
||||||
if CurStep = ssInstall then
|
|
||||||
RemoveLegacyVersion;
|
|
||||||
end;
|
|
||||||
|
|||||||
Reference in New Issue
Block a user