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), ], ), ),