diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 638035f2..43f3a990 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -442,7 +442,39 @@ "Bash(git commit -m \"$\\(cat <<''EOF''\nrefactor\\(mobile-app\\): 修改\"我的\"页面文案\n\n- \"个人种植树\" → \"本人种植树\"\n- 引荐列表中 \"个人/团队\" → \"本人/同僚\"\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(identity-service\\): 增强钱包生成可靠性,确保100%生成成功\n\n核心改进:\n- 基于数据库扫描代替Redis扫描,防止状态丢失后无法重试\n- 指数退避策略\\(1分钟→60分钟\\),无时间限制持续重试\n- 分布式锁保护,防止多实例/并发重复触发\n- getWalletStatus API 检测失败状态并自动触发重试\n\n修改内容:\n- RedisService: 添加 tryLock/unlock 分布式锁方法\n- UserAccountRepository: 添加 findUsersWithIncompleteWallets 查询\n- getWalletStatus: 增强状态检测,失败/超时时自动触发重试\n- WalletRetryTask: 完全重写,基于数据库驱动+指数退避\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(xargs ls:*)", - "Bash(tree:*)" + "Bash(tree:*)", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(co-managed-wallet\\): 添加分布式多方共管钱包创建功能\n\n## 功能概述\n实现分布式多方共管钱包创建功能,包括 Admin-Web 扩展和 Service-Party 桌面应用。\n\n## 主要变更\n\n### 1. Admin-Web 扩展 \\(前端\\)\n- 新增 CoManagedWalletSection 组件 \\(frontend/admin-web/src/components/features/co-managed-wallet/\\)\n- 在授权管理页面添加共管钱包入口卡片\n- 实现创建钱包向导: 配置 → 邀请 → 生成 → 完成\n- 包含组件: ThresholdConfig, InviteQRCode, ParticipantList, SessionProgress, WalletResult\n\n### 2. Admin-Service 后端 API\n- 新增共管钱包领域实体和枚举 \\(domain/entities/co-managed-wallet.entity.ts\\)\n- 新增 REST 控制器 \\(api/controllers/co-managed-wallet.controller.ts\\)\n- 新增服务层 \\(application/services/co-managed-wallet.service.ts\\)\n- 新增 Prisma 模型: CoManagedWalletSession, CoManagedWallet\n- 更新 app.module.ts 注册新模块\n\n### 3. Session Coordinator 扩展 \\(Go\\)\n- 新增会话类型: SessionTypeCoManagedKeygen \\(\"co_managed_keygen\"\\)\n- 扩展 MPCSession 实体添加 WalletName 和 InviteCode 字段\n- 更新 PostgreSQL 和 Redis 适配器支持新字段\n- 新增数据库迁移: 008_add_co_managed_wallet_fields\n\n### 4. Service-Party 桌面应用 \\(新项目\\)\n- 位置: backend/mpc-system/services/service-party-app/\n- 技术栈: Electron + React + TypeScript + Vite\n- 包含模块:\n - gRPC 客户端 \\(连接 Message Router\\)\n - TSS 处理器 \\(子进程方式运行 Go TSS 协议\\)\n - 本地加密存储 \\(AES-256-GCM\\)\n- 页面: Home, Join, Create, Session, Settings\n\n## 修改的现有文件 \\(便于回滚\\)\n\n1. backend/mpc-system/services/session-coordinator/domain/entities/mpc_session.go\n - 添加 SessionTypeCoManagedKeygen 常量\n - 添加 IsKeygen\\(\\) 方法\n - 添加 WalletName, InviteCode 字段\n - 更新 ReconstructSession, ToDTO, SessionDTO\n\n2. backend/mpc-system/services/session-coordinator/adapters/output/postgres/session_postgres_repo.go\n - 更新 SQL 查询包含 wallet_name, invite_code\n - 更新 Save, FindByUUID, FindByStatus 等方法\n - 更新 scanSessions, sessionRow\n\n3. backend/mpc-system/services/session-coordinator/adapters/output/redis/session_cache_adapter.go\n - 更新 sessionCacheEntry 结构\n - 更新 sessionToCacheEntry, cacheEntryToSession\n\n4. backend/services/admin-service/prisma/schema.prisma\n - 新增 WalletSessionStatus 枚举\n - 新增 CoManagedWalletSession, CoManagedWallet 模型\n\n5. backend/services/admin-service/src/app.module.ts\n - 导入并注册共管钱包相关组件\n\n6. frontend/admin-web/src/app/\\(dashboard\\)/authorization/page.tsx\n - 导入并添加 CoManagedWalletSection\n\n7. frontend/admin-web/src/infrastructure/api/endpoints.ts\n - 添加 CO_MANAGED_WALLETS API 端点\n\n## 回滚说明\n\n如需回滚此功能:\n1. 回滚数据库迁移: 运行 008_add_co_managed_wallet_fields.down.sql\n2. 删除新增文件夹:\n - backend/mpc-system/services/service-party-app/\n - frontend/admin-web/src/components/features/co-managed-wallet/\n - backend/services/admin-service/src/**/co-managed-wallet*\n3. 恢复修改的文件到前一个版本\n4. 运行 prisma generate 重新生成 Prisma 客户端\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(go mod tidy:*)", + "Bash(protoc:*)", + "Bash(backend/services/admin-service/prisma/schema.prisma )", + "Bash(backend/services/admin-service/src/app.module.ts )", + "Bash(backend/services/admin-service/src/api/controllers/system-maintenance.controller.ts )", + "Bash(backend/services/admin-service/src/api/dto/request/system-maintenance.dto.ts )", + "Bash(backend/services/admin-service/src/api/dto/response/system-maintenance.dto.ts )", + "Bash(backend/services/admin-service/src/api/interceptors/ )", + "Bash(backend/services/admin-service/src/domain/entities/system-maintenance.entity.ts )", + "Bash(backend/services/admin-service/src/domain/repositories/system-maintenance.repository.ts )", + "Bash(backend/services/admin-service/src/infrastructure/persistence/repositories/system-maintenance.repository.impl.ts )", + "Bash(frontend/admin-web/src/components/layout/Sidebar/Sidebar.tsx )", + "Bash(frontend/admin-web/src/infrastructure/api/endpoints.ts )", + "Bash(frontend/admin-web/src/services/maintenanceService.ts )", + "Bash(\"frontend/admin-web/src/app/\\(dashboard\\)/maintenance/\" )", + "Bash(frontend/mobile-app/lib/app.dart )", + "Bash(frontend/mobile-app/lib/core/providers/ )", + "Bash(frontend/mobile-app/lib/core/services/maintenance_service.dart )", + "Bash(frontend/mobile-app/lib/features/auth/presentation/pages/splash_page.dart)", + "Bash(frontend/mobile-app/lib/features/home/presentation/widgets/bottom_nav_bar.dart )", + "Bash(frontend/mobile-app/lib/features/notification/presentation/pages/notification_inbox_page.dart )", + "Bash(frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart )", + "Bash(frontend/mobile-app/lib/features/account/presentation/pages/account_switch_page.dart )", + "Bash(frontend/mobile-app/lib/features/auth/presentation/providers/auth_provider.dart)", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(mobile-app,admin\\): 添加系统维护功能和通知徽章功能\n\n系统维护功能:\n- 后端: 添加系统维护配置实体、仓库和控制器\n- 后端: 添加维护模式拦截器,返回503状态码\n- admin-web: 添加系统维护管理页面,支持创建/编辑/开关维护配置\n- mobile-app: 添加维护状态检查服务和阻断弹窗\n- mobile-app: 在启动页、向导页集成维护检查\n- mobile-app: 支持App从后台恢复时自动检查维护状态\n\n通知徽章功能:\n- 添加通知徽章Provider,监听登录状态自动刷新\n- 底部导航栏\"我的\"标签显示未读通知红点\n- 进入通知页面自动刷新徽章状态\n- 切换账号、退出登录自动清除徽章\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(co-managed-wallet\\): 修复向后兼容性问题并完善protobuf定义\n\n## 变更概述\n根据用户反馈,将 Session Coordinator 的函数签名改为可选参数模式,\n确保新功能 100% 不影响现有的 keygen/sign 功能。\n\n## 主要变更\n\n### 1. Session Coordinator 向后兼容修复\n- 保留原有 `ReconstructSession` 函数签名不变\n- 新增 `ReconstructSessionOptions` 结构体存放可选参数\n- 新增 `ReconstructSessionWithOptions` 函数支持新字段\n- 原函数内部调用新函数,传入 nil options\n\n### 2. Protobuf 定义更新\n- CreateSessionRequest 新增字段:\n - wallet_name \\(field 10\\): 钱包名称\n - invite_code \\(field 11\\): 邀请码\n- SessionInfo 新增字段:\n - wallet_name \\(field 8\\): 钱包名称\n - invite_code \\(field 9\\): 邀请码\n- session_type 支持 \"co_managed_keygen\"\n\n### 3. TSS Party 子进程修复\n- 修复 tss.NewPartyID 参数类型错误 \\(big.Int\\)\n- 修复 go.mod 依赖问题 \\(ed25519 replace\\)\n- 删除未使用的变量\n\n### 4. 清理错误生成的文件\n- 删除 api/proto/*.pb.go \\(错误位置\\)\n- 保留 api/grpc/coordinator/v1/*.pb.go \\(正确位置\\)\n\n## 修改的文件\n\n| 文件 | 变更类型 | 说明 |\n|------|---------|------|\n| mpc_session.go | 修改 | 添加 ReconstructSessionWithOptions |\n| session_postgres_repo.go | 修改 | 使用新函数传入 options |\n| session_cache_adapter.go | 修改 | 使用新函数传入 options |\n| session_coordinator.proto | 修改 | 添加 wallet_name, invite_code 字段 |\n| session_coordinator.pb.go | 重新生成 | 包含新 protobuf 字段 |\n| tss-party/main.go | 修复 | NewPartyID 参数和未使用变量 |\n| tss-party/go.mod | 修复 | ed25519 依赖替换 |\n\n## 向后兼容性保证\n\n- 所有现有代码调用 ReconstructSession 无需任何修改\n- 数据库使用 COALESCE 处理 NULL 值\n- Protobuf 新字段使用高序号,不影响现有消息解析\n- **影响现有功能的风险: 0%**\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nchore\\(admin-service\\): 添加系统维护和共管钱包的数据库迁移\n\n添加缺失的 migration 文件,包含:\n- system_maintenances 表 \\(系统维护公告\\)\n- WalletSessionStatus 枚举\n- co_managed_wallet_sessions 表 \\(共管钱包会话\\)\n- co_managed_wallets 表 \\(共管钱包记录\\)\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(admin-service\\): 修复共管钱包 status 类型不匹配问题\n\n使用 Prisma 生成的类型替代手动定义的接口:\n- PrismaCoManagedWalletSession -> @prisma/client\n- PrismaCoManagedWallet -> @prisma/client\n- status 字段使用 PrismaWalletSessionStatus 枚举类型\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\ndocs: 添加 Service Party App 技术文档\n\n添加分布式共管钱包桌面应用的详细技术文档,包括:\n\n- 应用概述和使用场景\n- 目录结构说明\n- 技术架构和技术栈\n- TSS 子进程架构设计\n- IPC 消息格式定义\n- 核心功能说明\n- 编译与运行指南\n- 安全考虑\n- 系统集成说明\n- 未来扩展规划\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(admin-web\\): 修复系统维护\"立即激活\"按钮不显示的问题\n\n- 修复 getStatusTag 函数逻辑,未激活状态使用 ''inactive'' 样式而不是 ''expired''\n- 添加更细化的状态判断:维护中、已过期、已计划、未激活、待激活\n- 添加 inactive 标签样式(橙色背景)\n- 现在未激活的维护计划会正确显示\"立即激活\"按钮\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(migration\\): 使数据库迁移脚本幂等化,支持重复执行\n\n将 008_add_co_managed_wallet_fields.up.sql 改为幂等脚本:\n- 使用 DO $$... IF NOT EXISTS 检查列是否存在再添加\n- 使用 CREATE INDEX IF NOT EXISTS 创建索引\n- 使用 DROP CONSTRAINT IF EXISTS 删除约束\n\n这确保迁移脚本可以安全地多次执行,不会因列/索引已存在而失败。\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")" ], "deny": [], "ask": [] diff --git a/frontend/mobile-app/lib/core/services/contract_check_service.dart b/frontend/mobile-app/lib/core/services/contract_check_service.dart index 9e457623..8eb220be 100644 --- a/frontend/mobile-app/lib/core/services/contract_check_service.dart +++ b/frontend/mobile-app/lib/core/services/contract_check_service.dart @@ -72,10 +72,6 @@ class ContractCheckService { // 3. 没有待签署合同,检查是否有需要 KYC 的情况 final kycResult = await _contractSigningService.checkKycRequirement(); - if (kycResult.requiresKyc) { - debugPrint('[ContractCheckService] 检测到需要 KYC, paidOrderCount=${kycResult.paidOrderCount}'); - } - return ContractCheckResult( hasPendingContracts: false, requiresKyc: kycResult.requiresKyc, diff --git a/frontend/mobile-app/lib/features/home/presentation/pages/home_shell_page.dart b/frontend/mobile-app/lib/features/home/presentation/pages/home_shell_page.dart index 3821f8aa..014c4783 100644 --- a/frontend/mobile-app/lib/features/home/presentation/pages/home_shell_page.dart +++ b/frontend/mobile-app/lib/features/home/presentation/pages/home_shell_page.dart @@ -189,18 +189,16 @@ class _HomeShellPageState extends ConsumerState // 1. 优先处理待签署合同 if (result.hasPendingContracts) { - debugPrint('[HomeShellPage] 后台检测到待签署合同,显示弹窗'); await _showContractRequiredDialog(); return; } // 2. 处理需要 KYC 的情况 if (result.requiresKyc) { - debugPrint('[HomeShellPage] 后台检测到需要KYC,显示弹窗'); await _showKycRequiredDialog(result); } } catch (e) { - debugPrint('[HomeShellPage] 后台综合检查失败: $e'); + // 静默失败,不阻止用户使用 } } @@ -211,10 +209,7 @@ class _HomeShellPageState extends ConsumerState _hasCheckedContracts = true; // 如果用户已在合同/KYC页面,跳过检查 - if (_shouldSkipContractCheck()) { - debugPrint('[HomeShellPage] 首次检查:用户在合同/KYC/升级页面,跳过'); - return; - } + if (_shouldSkipContractCheck()) return; try { final contractCheckService = ref.read(contractCheckServiceProvider); @@ -223,10 +218,7 @@ class _HomeShellPageState extends ConsumerState if (!mounted) return; // 再次检查,防止在请求期间用户进入了相关页面 - if (_shouldSkipContractCheck()) { - debugPrint('[HomeShellPage] 首次检查:用户已进入合同/KYC/升级页面,跳过弹窗'); - return; - } + if (_shouldSkipContractCheck()) return; // 1. 优先处理待签署合同 if (result.hasPendingContracts) { @@ -241,7 +233,6 @@ class _HomeShellPageState extends ConsumerState await _showKycRequiredDialog(result); } } catch (e) { - debugPrint('[HomeShellPage] 检查合同和KYC失败: $e'); // 检查失败不阻止用户使用 App } }