From 8fb81cc571e7ede56e7ff595b7da3d1341e30b5b Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 25 Aug 2026 19:11:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E5=8F=AA=E8=AF=BB=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=85=81=E8=AE=B8=E6=BF=80=E6=B4=BB=E5=85=91?= =?UTF-8?q?=E6=8D=A2=E5=88=B8=EF=BC=88=E8=87=AA=E6=95=91=E5=87=BA=E5=8F=A3?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 授权到期进入 readonly/locked 相位后,「兑换续期」按钮被全局 WriteGuard 误锁(置灰/隐藏),用户无法激活新授权码自救。后端 /license/* 本就豁免 LicenseGuard,去掉该按钮外层 WriteGuard 包裹; role=readonly 仍由后端 ReadOnly() 403 兜底。 Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5 --- client/lib/screens/settings/license_panel.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/lib/screens/settings/license_panel.dart b/client/lib/screens/settings/license_panel.dart index c541be7..51b8682 100644 --- a/client/lib/screens/settings/license_panel.dart +++ b/client/lib/screens/settings/license_panel.dart @@ -18,7 +18,6 @@ import '../../core/utils/clock.dart'; import '../../providers/license_provider.dart'; import '../../widgets/ds/ds_atoms.dart'; import '../../widgets/ds/ds_toast.dart'; -import '../../widgets/write_guard.dart'; import 'settings_card.dart'; class LicensePanel extends ConsumerStatefulWidget { @@ -123,11 +122,12 @@ class _LicensePanelState extends ConsumerState { ), ), const SizedBox(width: 10), - WriteGuard( - child: DsButton(_redeeming ? '兑换中…' : '兑换续期', - variant: DsBtnVariant.primary, - onPressed: _redeeming ? null : _redeem), - ), + // 激活/兑换是过期后的「自救出口」:后端 /license/* 豁免 LicenseGuard, + // 故此按钮不受授权相位(readonly/locked)只读锁约束,绝不能包 WriteGuard; + // role=readonly 用户由后端 ReadOnly() 403 + toast 兜底。 + DsButton(_redeeming ? '兑换中…' : '兑换续期', + variant: DsBtnVariant.primary, + onPressed: _redeeming ? null : _redeem), ], ), ),