diff --git a/client/lib/widgets/content_top_bar.dart b/client/lib/widgets/content_top_bar.dart index 8f79334..968a784 100644 --- a/client/lib/widgets/content_top_bar.dart +++ b/client/lib/widgets/content_top_bar.dart @@ -63,7 +63,7 @@ class ContentTopBar extends ConsumerWidget { ), if (onBell != null) ...[ const SizedBox(width: 12), - NotificationBell(onTap: onBell, hasUnread: true), + NotificationBell(onTap: onBell!, hasUnread: true), ], if (showThemeToggle) ...[ const SizedBox(width: 12), diff --git a/client/lib/widgets/notification_bell.dart b/client/lib/widgets/notification_bell.dart index ecfab2b..effcd68 100644 --- a/client/lib/widgets/notification_bell.dart +++ b/client/lib/widgets/notification_bell.dart @@ -10,7 +10,7 @@ import 'pangolin_icons.dart'; class NotificationBell extends ConsumerWidget { const NotificationBell({super.key, required this.onTap, this.hasUnread = false}); - final VoidCallback? onTap; + final VoidCallback onTap; final bool hasUnread; @override diff --git a/local-l13-start.sh b/local-l13-start.sh new file mode 100644 index 0000000..7228f22 --- /dev/null +++ b/local-l13-start.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# 本地联调一键启动:pay(mock 渠道) + pangolin server + 官网 /buy 购买页。 +# 仅本地测试用。密钥是 throwaway 值,勿用于生产,勿提交真值。 +# +# 端口(本机因 :8080 被 dudu 项目、:4321 被另一 astro 占用而错开): +# pay :8090 (SERVER_PORT) +# pangolin :8083 (ADDR) +# 官网 :4321→自动顺延(实际看启动日志,本次是 :4322),用 http://localhost:PORT/buy/ +# +# 依赖:redis(本机已有 server-redis-1 容器在 :6379;没有就 `docker run -d -p 6379:6379 redis:7-alpine`) +set -euo pipefail + +SECRET="localdev_pangolin_secret_2026" # 两侧共用的本地 throwaway HMAC 密钥 +PAY_DIR="/Users/wangjia/code/pay" +PG_DIR="/Users/wangjia/code/pangolin/.claude/worktrees/pay-v2-integration/server" +WEB_DIR="/Users/wangjia/code/pangolin/.claude/worktrees/pay-v2-integration/web/website" +DB="/tmp/pg-pangolin.db" +JWT="/tmp/pg-jwt_priv.pem" +LOGDIR="/tmp/pg-l13-logs"; mkdir -p "$LOGDIR" + +echo "== redis 探活 ==" +redis_ok=$(docker exec server-redis-1 redis-cli ping 2>/dev/null || echo "") +[ "$redis_ok" = "PONG" ] || { echo "redis 未就绪:请先 docker run -d -p 6379:6379 redis:7-alpine"; exit 1; } + +echo "== JWT 密钥 ==" +[ -f "$JWT" ] || openssl genrsa -out "$JWT" 2048 + +echo "== pangolin sqlite 迁移 ==" +( cd "$PG_DIR" && DB_DRIVER=sqlite DB_DSN="$DB" go run ./cmd/migrate up ) + +echo "== 起 pay(:8090,mock 渠道,webhook tick 2s)==" +( cd "$PAY_DIR" && MOCK_CHANNEL_ENABLED=true SERVER_PORT=8090 WEBHOOK_TICK_SECONDS=2 \ + BIZ_PANGOLIN_SECRET="$SECRET" go run . > "$LOGDIR/pay.log" 2>&1 & ) + +echo "== 起 pangolin(:8083,sqlite,接 pay :8090)==" +( cd "$PG_DIR" && DB_DRIVER=sqlite DB_DSN="$DB" ADDR=:8083 REDIS_ADDR=127.0.0.1:6379 \ + JWT_PRIVATE_KEY_PATH="$JWT" JWT_KEY_ID=dev-1 \ + PAY_BASE_URL=http://127.0.0.1:8090 PAY_BIZ_SECRET="$SECRET" PAY_BIZ_SYSTEM=pangolin \ + go run ./cmd/server > "$LOGDIR/pangolin.log" 2>&1 & ) + +echo "== 起官网(astro dev,proxy /v1→:8083 /paydev→:8090)==" +( cd "$WEB_DIR" && npm run dev > "$LOGDIR/website.log" 2>&1 & ) + +echo +echo "启动中… 约 15s 后:" +echo " 官网购买页 → 看 $LOGDIR/website.log 里的 Local 端口(本次 http://localhost:4322/buy/)" +echo " 登录账号 → paytest@gmail.com / testpass12345 (已注册;换邮箱需先注册)" +echo " 日志 → $LOGDIR/{pay,pangolin,website}.log" +echo " 停止 → lsof -ti tcp:8090,8083,4321,4322 | xargs kill"