feat(client): pay v2 支付渠道 switch + 订单列表/详情端到端

购买/支付(Phase B):
- 新 SegSwitch 段控 widget(镜像 .segswitch 原子)
- 购买页重构:顶部支付渠道 switch(默认 USDT→加密货币 / 人民币→支付宝),套餐价随渠道分币种显示,删底部弹窗选方式;点购买直达支付页
- 支付页加订单信息卡(套餐/渠道/金额按币种)
- models:PayChannel + PayCatalogItem.priceUsdtMicro/priceLabel(ch)/perMonthLabel(ch)

订单(P0,全新):
- payment_api.listOrders() + orders_provider(列表 + 详情 family)
- OrdersScreen 列表→详情(状态 pill / 可复制订单号 / 继续支付·重新购买)
- 导航:NavView.orders + desktop_shell 分支 + account 入口

配套:
- l10n +19 getter(支付渠道 4 + 订单 15)×6 语言,l10n 闸绿
- 图标单源迁移 lucide_icons_flutter + pangolin_icons.dart(codegen)
- 联系渠道订正(Telegram/邮件 support@yanmeiai.com/官网) + 前端去广告&时长
- 测试:购买 switch 分币种 + 订单列表/空态/详情 + 假 API listOrders;golden 重录
- flutter analyze 0 error,flutter test 226 全绿

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:
wangjia
2026-07-12 00:07:15 +08:00
parent f6ce5267d5
commit 272eca04ce
66 changed files with 1398 additions and 262 deletions
+102 -2
View File
@@ -1,6 +1,6 @@
// strings_ru.dart — русские текстовые ресурсы (отображение на одном языке)
//
// Запрещённые слова: VPN /翻墙 / 科学上网 / 突破封锁 / 自由穿越 / Go anywhere / ВПН.
// Запрещённые слова: термины обхода цензуры. Список см. design/CLAUDE.md §1 правило 13.
// Позиционирование: ускорение сети / оптимизация опыта + приватность.
// Номера тарифов соответствуют design/CLAUDE.md §7.
import 'app_text.dart';
@@ -65,7 +65,7 @@ class StringsRu extends AppText {
@override
String get watchAdMore => 'Смотрите рекламу, чтобы добавить время';
@override
String get quotaExhaustedNotice => 'Дневной бесплатный лимит исчерпан. Посмотрите рекламу, чтобы добавить время, или оформите подписку.';
String get quotaExhaustedNotice => 'Дневной бесплатный лимит исчерпан. Оформите подписку, чтобы продолжить подключение.';
@override
String get adPlaying => 'Реклама воспроизводится…';
@override
@@ -311,6 +311,8 @@ class StringsRu extends AppText {
@override
String get contactStore => 'Магазин самообслуживания';
@override
String get contactWebsite => 'Веб-сайт';
@override
String get contactHoursTitle => 'Часы поддержки';
@override
String get contactHours => 'Ежедневно 9:00 24:00 (GMT+8)';
@@ -370,4 +372,102 @@ class StringsRu extends AppText {
String get ob3Title => 'Приватность по умолчанию';
@override
String get ob3Sub => 'Сквозное шифрование. Мы не храним журналы просмотров.';
// ── 购买 / 支付 ──
@override
String get purchaseTitle => 'Покупка тарифа';
@override
String get paymentTitle => 'Оплата';
@override
String get buyNow => 'Купить';
@override
String get payMethodAlipay => 'Alipay';
@override
String get payMethodCrypto => 'USDT (TRC20)';
@override
String get choosePayMethod => 'Выберите способ оплаты';
@override
String get proMonthly => 'Pro · Месяц';
@override
String get proQuarterly => 'Pro · Квартал';
@override
String get proYearly => 'Pro · Год';
@override
String get perQuarter => '/квартал';
@override
String get perYear => '/год';
@override
String get payAmountLabel => 'Сумма перевода';
@override
String get payAddressLabel => 'Адрес для оплаты';
@override
String get payNetworkLabel => 'Сеть';
@override
String get payExactAmountHint => 'Отправьте точную сумму — активация произойдёт автоматически';
@override
String get copied => 'Скопировано';
@override
String get openAlipay => 'Оплатить через Alipay';
@override
String get openAlipayHint => 'Вернитесь после оплаты — страница обновится автоматически';
@override
String get openAlipayFailed => 'Не удалось открыть Alipay. Проверьте, установлен ли он, или повторите';
@override
String get awaitingPayment => 'Ожидание оплаты';
@override
String get paySucceeded => 'Активировано';
@override
String get payExpiresAt => 'Действует до';
@override
String get payDone => 'Готово';
@override
String get payFailed => 'Оплата не удалась';
@override
String get payRetry => 'Повторить';
@override
String get switchPayMethod => 'Сменить способ оплаты';
@override
String get cancelOrder => 'Отменить заказ';
@override
String get qrNotSupported => 'Скопируйте и откройте в Alipay';
// ── 支付渠道 switch + 订单 ──
@override
String get payChannel => 'Способ оплаты';
@override
String get payChannelUsdt => 'USDT · Крипто';
@override
String get payChannelCny => 'Юань · Alipay';
@override
String get perMonthSuffix => ' /мес';
@override
String get ordersTitle => 'Мои заказы';
@override
String get orderDetailTitle => 'Детали заказа';
@override
String get ordersEmpty => 'Заказов пока нет';
@override
String get orderNoLabel => 'Номер заказа';
@override
String get orderPlanLabel => 'Тариф';
@override
String get orderMethodLabel => 'Способ оплаты';
@override
String get orderAmountLabel => 'Сумма';
@override
String get orderCreatedLabel => 'Создан';
@override
String get orderPaidLabel => 'Оплачен';
@override
String get orderStatusPaid => 'Активирован';
@override
String get orderStatusCanceled => 'Отменён';
@override
String get orderContinuePay => 'Продолжить оплату';
@override
String get orderRefresh => 'Обновить';
@override
String get orderRebuy => 'Купить снова';
@override
String get payMethodNezha => 'Nazhapay';
}