hailin
65d2904f1a
feat(deploy): 扩展Nginx配置覆盖全部11个.com子域名
...
Namecheap DNS 新增 8 条记录 (→ 154.84.135.121):
portal / console / auth / rpc / explorer / bridge / faucet / ipfs-gw
SSL 证书已扩展覆盖全部 11 个 .com 子域名 (Let's Encrypt)
临时方案: .cn 域名因 ICP 备案未完成被 ISP 拦截,
所有公网服务走 .com 域名绕行海外 IP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 02:36:24 -08:00
hailin
535f53041f
feat(deploy): Nginx反向代理 + SSL + 前端切换域名
...
部署架构:
- Nginx (跳板机 14.215.128.96) → Kong (192.168.1.222:48080)
- SSL: Let's Encrypt 证书已为 api.gogenex.com 签发
- HTTP 自动 301 → HTTPS
前端 API 地址:
- genex-mobile: https://api.gogenex.com (ApiClient + UpdateService)
- miniapp: https://api.gogenex.com (development config)
- 备案完成后切回 https://api.gogenex.cn
Namecheap DNS 新增:
- admin.gogenex.com → 154.84.135.121
- ws.gogenex.com → 154.84.135.121
备注:
- gogenex.cn 的 80/443 端口被世纪互联 ISP 拦截,需完成 ICP 备案
- admin/ws 子域名的 SSL 证书待 DNS 传播后申请
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 00:00:58 -08:00
hailin
457ee8f4cb
feat(infra): 双域名DNS架构 + DNS管理脚本
...
## 域名规划
- gogenex.cn (阿里云DNS): 29条记录,国内公网指向 14.215.128.96
- gogenex.com (Namecheap DNS): 5条记录,海外公网指向 154.84.135.121
- 两个域名到达同一台物理服务器(双网卡),再反代到内网 192.168.1.222
## DNS 管理脚本
- scripts/alidns_manager.py: 阿里云DNS单条记录CRUD
- scripts/alidns_batch.py: 阿里云DNS批量配置
- scripts/namecheap_manager.py: Namecheap DNS安全读-合并-写操作
- scripts/namecheap_batch.py: Namecheap DNS批量配置
- 修复 namecheap_manager.py XML解析大小写问题 (Host vs host)
## 文档
- docs/gogenex-domain-planning.md: 双域名架构规划 v1.1
- docs/plan-schema.md: 批量DNS配置JSON格式定义
- docs/migration-guide.md: DNS迁移指南
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:12:47 -08:00
hailin
6e6723a664
fix(auth): 参照rwdurian实现重写AliyunSmsProvider
...
使用 sendSmsWithOptions + RuntimeOptions 替代 sendSms,
与 rwdurian identity-service 已验证的实现保持一致。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 01:00:30 -08:00
hailin
9c2e8b8024
fix(auth): AliyunSmsProvider 使用 SendSmsRequest 构造请求对象
...
修复 request.validate is not a function 错误,
dysmsapi v3 SDK 的 sendSms() 需要 SendSmsRequest 实例而非 plain object。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:55:54 -08:00
hailin
8ed667bcf4
feat(联调): 前端指向远程API + 启用阿里云SMS
...
- genex-mobile ApiClient/UpdateService 指向 154.84.135.121:48080
- miniapp dev 环境指向 154.84.135.121:48080
- docker-compose 添加 ALIYUN SMS 环境变量透传
- auth-service 添加 @alicloud/dysmsapi20170525 等 SDK 依赖
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:18:05 -08:00
hailin
24400ad663
fix(admin-app): 消除UI层硬编码中文,补充i18n keys(zh/en/ja)
...
- 新增 29 个 i18n keys 到三语言文件(credit_score_unit, finance_confirm_withdraw,
redemption_failed, store_no_stores, settings_confirm_logout, coupon_status_* 等)
- 修复 10 个页面中的硬编码中文字符串:
credit_page: 分数单位、权重、空状态
finance_page: 提现对话框、SnackBar、时间格式、空状态
redemption_page: 错误消息、批量结果、空状态、时间格式
store_management_page: 门店/员工空状态
settings_page: 退出确认对话框、层级权益描述
coupon_list_page: 状态徽章(在售/待审/售罄/下架)
coupon_detail_page: 面值/发行价标签
ai_agent_page: 错误回复消息
issuer_dashboard_page: 信用分单位
- 剩余中文仅存于 /// 注释和 mock 数据数组中(将被真实API数据替换)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:29:10 -08:00
hailin
d9b07537a1
fix(admin-web): MarketMakerPage useApiMutation 方法名大写
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:21:42 -08:00
hailin
e8f67527c7
fix(auth): LoginDto.deviceInfo/ipAddress 添加 @IsOptional
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:18:21 -08:00
hailin
6d3d45a4fb
fix(auth): Aliyun SMS 用 require() 替代 import() 避免 TS2307
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:11:14 -08:00
hailin
9eb35e5f1e
fix(auth): 修复 TypeScript 编译错误 — RegisterDto.password 可选 + Aliyun import 类型
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:10:28 -08:00
hailin
8a12bc225d
fix(seed): 修复 address_mappings 种子数据匹配实际 schema
...
- address_mappings: 添加 internal_address + chain_type, 移除不存在的 signature 列
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:06:26 -08:00
hailin
4651edae35
fix(seed): 更新 disputes + audit_logs 种子数据匹配新 schema
...
- disputes: buyer_id/seller_id → plaintiff_id/defendant_id, 移除已删除列
- audit_logs: actor_id/actor_role/resource_type → admin_id/admin_name/resource
- 枚举值对齐: buyer_complaint → buyer_claim, evidence_collection → processing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:04:31 -08:00
hailin
686bf6c395
fix(schema): 统一 disputes + audit_logs 迁移与实体定义
...
- 新增 045_align_disputes_audit_logs.sql: ALTER迁移对齐021/022旧schema到实体期望schema
- disputes: buyer_id→plaintiff_id, seller_id→defendant_id, 添加amount+version列
- audit_logs: actor_id→admin_id, resource_type→resource, 添加admin_name+result+updated_at+version列
- 将028/029改为no-op (已被045取代)
- Dispute entity: enum类型改为varchar (匹配CHECK约束而非PostgreSQL原生enum)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:01:20 -08:00
hailin
7fc3123b5a
fix(auth): 补全部署前置条件 — version列迁移 + docker-compose优化
...
- 新增 044_add_users_version_column.sql 迁移 (TypeORM @VersionColumn 需要)
- auth-service 移除 Kafka 硬依赖 (EventPublisher 已有 graceful no-op)
- docker-compose 添加 SMS_ENABLED/SMS_CODE_EXPIRE_SECONDS/SMS_DAILY_LIMIT 环境变量
- 新增 auth-service/.env.example 文档化所有必需环境变量
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:49:31 -08:00
hailin
e8d9bdc2fb
fix(api): 修复前后端 API 对接 — 响应结构+字段名对齐
...
端到端审查发现并修复 4 类前后端不匹配问题:
## 1. 响应结构嵌套不匹配
后端返回 `{ data: { user, tokens: { accessToken, refreshToken } } }`
但 miniapp/admin-app/admin-web 均按扁平结构解析
- miniapp services/auth.ts: 新增 AuthResponse→LoginResult 映射层
- miniapp store/auth.ts: 从 `resp.tokens.accessToken` 取 token
- admin-app auth_service.dart: LoginResult.fromJson 优先从 tokens 子对象取
- admin-web auth-context.tsx: 从 `result.tokens.accessToken` 取 token
## 2. 密码登录字段名不匹配
后端 LoginDto 字段为 `identifier`, 但 admin-app 发 `email`, admin-web 发 `email`
- admin-app: `'email' → 'identifier'`
- admin-web: `{ email, password } → { identifier: email, password }`
## 3. 注册 password 字段必填 vs 前端可选
miniapp h5-register 只收集手机+验证码, 不传 password, 会触发 400 校验
- backend RegisterDto: password 改为 @IsOptional
- auth.service.ts: 未传 password 时自动生成随机密码
## 4. miniapp LoginResult 类型导出
- 导出 LoginResult 接口供外部使用
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:39:26 -08:00
hailin
7d00cade2f
fix(i18n): 清除前端页面中残留的硬编码中文
...
问题: 在英文/日文语言环境下,部分页面仍显示中文字符
修复内容:
## genex-mobile
- register_page.dart: `const TextSpan(text: ' 和 ')` → `context.t('register.and')`
- 4 语言文件新增 `register.and` key (和/和/and/および)
## miniapp
- login + h5-register: 移除 Toast fallback 中文 (`|| '验证码已发送'` 等)
- login + h5-register: 移除 JSX 中硬编码的《》书名号,改为 i18n 值内包含
· zh-CN: `《用户协议》`、`《隐私政策》`
· en-US: `User Agreement`、`Privacy Policy` (无括号)
· ja-JP: `「利用規約」`、`「プライバシーポリシー」`
- ai-guide 组件: 4 个推荐标签从硬编码改为 `t('ai_recommend_N')`
· 新增 12 个 i18n key (3 语言 × 4 标签)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:27:24 -08:00
hailin
e59c0d0527
feat(admin): SMS 管理后台 — admin 端点 + 用户管理增强 + SMS 日志页
...
Phase 8: admin-web 后台管理增强
## 后端 (auth-service)
- 新增 AdminSmsController (JWT 保护):
· GET /admin/sms/logs — 按手机号查询 SMS 发送日志
· GET /admin/sms/logs/user/:id — 按用户 ID 查询其 SMS 日志
· POST /admin/sms/unlock/:id — 手动解锁账号(清除 loginFailCount + lockedUntil)
· 手机号脱敏: 138****5678 格式
- auth.module.ts 注册 AdminSmsController
## 前端 (admin-web)
- UserManagementPage 增强:
· 新增状态列: 正常(绿) / 已冻结(红) / 已锁定(黄)
· 手机号自动掩码显示
· 冻结/解冻按钮根据状态切换
· 锁定用户显示"解锁"按钮
- 新增 SMS 日志查看页面 (SmsLogPage):
· 按手机号搜索 SMS 发送记录
· 类型、状态 badge 展示
· 路由: /users/sms-logs
- AdminLayout 侧边栏新增 "SMS 日志" 导航项
- i18n 补充 (zh-CN/en-US/ja-JP):
· 用户状态: user_active, user_frozen, user_locked, user_unlock
· SMS 日志: 17 个新 key (sms_log_*, sms_type_*, sms_status_*, nav_users_sms_logs)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:34:15 -08:00
hailin
c29067eee7
feat(miniapp+admin-app): 同步 SMS 认证 API 变更
...
Phase 7 — Taro miniapp + admin-app 前端同步后端 SMS 认证系统:
miniapp (Taro/React):
- auth.ts: 新增 SmsCodeType 类型,sendSmsCode 支持 type 参数
· 端点从 /auth/send-sms-code → /auth/sms/send
· 新增 loginByPassword / resetPassword API
· register 支持 password + nickname 可选参数
- store/auth.ts: sendSmsCode 同步 type 参数 + 新端点
- login/index.tsx: 发送验证码时指定 type='LOGIN'
- h5-register/index.tsx: 发送验证码时指定 type='REGISTER'
· 修复注册后 token 存储使用 config.TOKEN_KEY 而非硬编码
- i18n: 3语言新增 7 key (login_code_sent, login_error_*,
register_success, register_error_agree)
admin-app (Flutter):
- auth_service.dart: 新增 SmsCodeType 枚举
· sendSmsCode 支持 type 参数,端点同步 /auth/sms/send
· 返回 expiresIn (秒)
- issuer_login_page.dart: 发送验证码时指定 SmsCodeType.login
- i18n: 3语言新增 4 key (login_error_phone, login_error_code,
login_error_network, login_code_sent)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:24:47 -08:00
hailin
4b1cdf9fb3
feat(genex-mobile): Flutter 前端对接 SMS 认证 API
...
Phase 6 — Flutter 前端完整对接后端 SMS 认证系统:
新增组件:
- OtpInput: 6位验证码输入框,支持自动跳转、粘贴、错误状态
- CountdownButton: 短信验证码倒计时按钮(60s),发送失败不启动倒计时
新增服务:
- AuthService: 单例认证服务,封装全部 auth API
· sendSmsCode (REGISTER/LOGIN/RESET_PASSWORD/CHANGE_PHONE)
· register / loginByPassword / loginByPhone
· resetPassword / changePassword / changePhone
· refreshToken / logout
· ValueNotifier<AuthResult?> 状态管理
页面重写 (对接真实 API):
- LoginPage: 双 Tab (密码/验证码登录),错误提示 Banner,账户锁定展示
- RegisterPage: 三步注册流程,CountdownButton 集成,密码强度检查
- ForgotPasswordPage: 四步找回密码,验证码重发,密码一致性校验
i18n 补充 (4语言 × 13 新 key):
- login: noAccount, registerNow, networkError, errorPhoneRequired,
errorPasswordMin, errorCodeInvalid
- register: hasAccount, loginNow, errorPhoneRequired, errorCodeInvalid,
errorPasswordWeak, errorTermsRequired
- forgot: errorPasswordMismatch
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:23:25 -08:00
hailin
e89ec82406
feat(auth): 完整实现 SMS 手机注册/登录/验证系统
...
参考 rwadurian 项目的成熟实现,在 Genex auth-service 上全面增强短信验证体系。
## 新增功能
### Domain 层
- Phone Value Object: E.164 标准化、中国大陆格式自动补+86、掩码显示(138****8000)
- SmsCode Value Object: crypto 安全随机6位生成、格式验证
- SmsVerification Entity: 验证码记录持久化,支持4种类型(REGISTER/LOGIN/RESET_PASSWORD/CHANGE_PHONE)
- SmsLog Entity: SMS发送日志审计追踪(provider/status/error)
- User Entity 增强: loginFailCount + lockedUntil 字段,指数退避锁定策略(1→2→4→8...→1440分钟)
- 5个新 Domain Events: SmsCodeSent, SmsCodeVerified, AccountLocked, PhoneChanged, PasswordReset
### Infrastructure 层
- 3个 SQL 迁移: users表锁定字段(041), sms_verifications表(042), sms_logs表(043)
- SmsVerification/SmsLog TypeORM Repository 实现
- SMS Provider 抽象层: ISmsProvider 接口 + ConsoleSmsProvider(开发) + AliyunSmsProvider(生产)
- Redis SmsCodeService 增强: 类型前缀 auth:sms:{type}:{phone},保留向后兼容
### Application 层
- 独立 SmsService: 发送验证码(日限额10条+业务规则校验) + 验证验证码(尝试限制5次)
- AuthService 重构: 注册需SMS验证、密码登录带锁定检查、+resetPassword/changePhone
### Interface 层
- 新端点: POST /auth/sms/send, POST /auth/reset-password, POST /auth/change-phone
- DTO 更新: RegisterDto 增加 smsCode 必填, SendSmsCodeDto 增加 type 枚举
- 全部端点 Swagger 文档
### 配置
- .env.example: SMS_ENABLED, ALIYUN_SMS_*, SMS_DAILY_LIMIT, LOGIN_MAX_FAIL_ATTEMPTS
- auth.module: SMS_PROVIDER 按 SMS_ENABLED 环境变量自动切换
## API 端点一览
- POST /api/v1/auth/sms/send — 发送验证码(4种类型)
- POST /api/v1/auth/register — 手机注册(phone+smsCode+password)
- POST /api/v1/auth/login — 密码登录(带锁定检查)
- POST /api/v1/auth/login-phone — 短信验证码登录
- POST /api/v1/auth/reset-password — 重置密码
- POST /api/v1/auth/change-phone — 换绑手机(需登录)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:12:57 -08:00
hailin
2ff8b48e50
fix(branding): 统一Logo色调与App主色调 #6C5CE7
...
旧Logo用 #9B5CF6/#D946EF 紫粉渐变,与App主色 #6C5CE7 不一致。
现统一为 Left=#6C5CE7→#7B6DEE, Right=#9B8FFF→#B8ADFF。
- 更新源SVG (genex-icon/lockup) 渐变色
- 重新生成PNG并分发至全部5个前端应用
- 修正 welcome_page EX ShaderMask 渐变色
- 替换 miniapp share-card 硬编码旧色值
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 18:12:35 -08:00
hailin
4682229a8c
fix(welcome): 品牌名严格遵循 lockup 设计规范
...
按 genex-lockup.svg 规范修正品牌名渲染:
- "GEN" = 深色 #1A103A (solid)
- "EX" = 渐变 #D946EF → #E11D89 (ShaderMask)
- fontWeight: 800, letterSpacing: -0.3
之前错误地将整个"Genex"做成全渐变,不符合品牌 VI。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:18:17 -08:00
hailin
9d7a5a7266
fix(welcome): 修复欢迎页3个设计问题
...
1. Logo色与主色调不一致 — 品牌名"Genex"改用 ShaderMask 渐变
(#9B5CF6→#D946EF),与 logo icon 色系完全匹配
2. Logo到品牌名间距过大 — 24px → 12px,品牌名到slogan 8px → 6px
符合 8pt grid 美学标准(紧凑型视觉组 4-8-12px)
3. 缺少微信登录 — 新增 WeChat 社交登录按钮(绿色#07C160),
4语言i18n key: welcome.wechat
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:12:49 -08:00
hailin
3aeb0885a0
fix(android): 启用 core library desugaring — 修复 flutter_local_notifications 构建失败
...
flutter_local_notifications 插件需要 Java 8+ API desugaring 支持。
在 build.gradle.kts 中启用 isCoreLibraryDesugaringEnabled 并添加
desugar_jdk_libs:2.1.4 依赖。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:00:46 -08:00
hailin
a92f00af25
feat(branding+fix): 中文品牌名、miniapp logo资源、编译错误修复
...
## 中文品牌名更新
- admin-app: 中文环境下 app_name → "企业券信",login_title/ai_welcome/settings_about 同步更新
- miniapp: 中文环境下 app_name → "券信",6处内联文本(share/activity/register/ai_chat等)同步更新
- genex-mobile: zh_cn + zh_tw 共12处 "Genex" → "券信"(login/register/aiChat/profile/aiFab)
- 英文/日文环境保持 "Genex" 不变
## miniapp logo 资源集成
- 新增 src/assets/images/ 目录:logo.png, logo_icon.png, logo_icon.svg, logo_full.svg
- login 页:CSS模拟logo(.logo-left/.logo-right) → <image src={logoIcon}>
- h5-share 页:💎 emoji → <img src={logoIcon}> (header + RegisterGuidePage)
- h5-activity 页:"G" 文字方块 → <image src={logoIcon}> (footer)
- h5-register 页:"G" 文字方块 → <image src={logoIcon}> (branding section)
## genex-mobile 编译错误修复
- wallet_coupons_page: EmptyState.noCoupons() + StatusTags.active/pending/expired/used() 添加 context 参数
- trading_page: StatusTags.onSale/completed/cancelled() 添加 context 参数
- message_page: EmptyState.noMessages() 添加 context 参数
- coupon_service: inner['total'] 添加 `as int?` 显式类型转换
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 16:57:30 -08:00
hailin
3a57b0fd4d
feat: 全平台API对齐 — 4个前端应用55+页面接入真实后端API
...
跨越 genex-mobile、admin-app、admin-web、miniapp 四个前端应用,
将所有页面从 mock 硬编码数据替换为真实后端 API 调用,
同时补建后端缺失的 27+ 个端点,实现前后端完整联通。
## 后端新增 (4个微服务, 27+端点)
### issuer-service — 5个新Controller, 19个新文件
- IssuerStatsController: GET /issuers/me/stats, /credit (发行商仪表盘统计+信用)
- IssuerFinanceController: GET/POST balance/stats/transactions/withdraw/reconciliation
- IssuerStoreController: CRUD /issuers/me/stores + /employees (门店+员工管理)
- RedemptionController: POST scan/manual/batch, GET history/today-stats (核销)
- CouponBatchController: POST issue/recall/price-adjust, GET operations (批量操作)
- CouponController扩展: GET /search, /:id/nearby-stores, /:id/similar
- 新实体: Employee, Redemption; Store 增加 level/parentId
- 新迁移: 032_create_stores_employees_redemptions.sql
### trading-service (Go)
- GET /api/v1/trades/my/orders — 用户订单列表(分页+状态筛选)
- POST /api/v1/trades/coupons/:id/transfer — 券转赠
### user-service
- GET/PUT /api/v1/users/me/settings — 用户偏好设置(语言/货币/通知)
### auth-service
- POST /api/v1/auth/send-sms-code — 发送短信验证码(Redis存储, 5分钟TTL)
- POST /api/v1/auth/login-phone — 手机号+验证码登录(自动注册)
### Kong 路由
- 新增5条路由: issuers/me, redemptions, coupons/batch, trades/my, trades/coupons
## genex-mobile (Flutter, 2页)
- HomePage: 接入 CouponApiService.getFeaturedCoupons() + getHoldingsSummary()
- WalletCouponsPage: 接入持仓列表API, 支持Tab状态筛选
- 修复 NotificationService/PushService 7+2个路径缺少 /api/v1/ 前缀
- 新增 CouponApiService, CouponModel, HoldingsSummaryModel
## admin-app (Flutter发行商控制台, 11页 + router + i18n)
- 修复 NotificationService 7个路径 + PushService 2个路径前缀
- 新增9个Service: auth, issuer, coupon, finance, credit, store, redemption, analytics, ai_chat
- 11页全部从 StatelessWidget→StatefulWidget, mock→API:
IssuerLoginPage(SMS登录), Dashboard(统计), CouponList(分页+筛选),
CreateCoupon(提交审核), CouponDetail(详情), Redemption(扫码/手动/批量核销),
Finance(余额/流水/对账), Credit(评分), StoreManagement(门店+员工),
AiAgent(真实AI对话), Settings(资料+登出)
- 所有页面添加 loading/error/pull-to-refresh 状态
## admin-web (Next.js 15管理后台, 24页)
- 新建API基础设施: api-client.ts(axios), auth-context.tsx, use-api.ts(react-query)
- providers.tsx 接入 QueryClientProvider + AuthProvider
- 24页全部替换 useState(mockArray) 为 useApi<T>('/api/v1/admin/...'):
Dashboard, Users, Issuers, Coupons, Trading, Risk, Finance, System,
Compliance(SAR/SEC/License/SOX/Tax/IPO), Analytics(User/Coupon/MM/Consumer),
Disputes, Chain, Reports, Merchant, Agent, Insurance
- 所有页面添加 TypeScript 接口, loading/error 状态, 'use client' 指令
- 状态比较改用原始API字符串(非t()翻译值)
## miniapp (Taro/React小程序, 20页)
- 新建API基础设施: config/index.ts, utils/request.ts(Taro.request封装), store/auth.ts
- 新增8个Service: auth, coupon, my-coupon, user, trading, wallet, notification, ai
- 20页全部替换硬编码数据为Service调用:
Home, Search, Detail, Purchase, PaymentSuccess,
MyCoupons, MyCouponDetail, Redeem, Transfer,
Profile, Orders, Messages, Wallet, Settings, KYC, AIChat,
Login, H5Share, H5Activity, H5Register
- 统一 useState+useEffect 数据获取模式, 错误处理, 加载状态
## 统计
- 新建文件: ~51个 (后端26 + 前端25)
- 修改文件: ~93个 (后端24 + 前端69)
- 新增后端端点: 27+
- 前端页面接入API: 55+ (genex-mobile 2 + admin-app 11 + admin-web 24 + miniapp 20)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:53:07 -08:00
hailin
e44e052efa
fix(branding): 重新生成全平台图标 — 基于更新后的Logo SVG v2
...
## 变更
- genex-icon.svg: viewBox 72→100, 去除圆角路径, 调整notch半径和形状尺寸
- genex-04.svg → genex-lockup.svg: 重命名, 缩放0.7x, viewBox 380→200
## 重新生成的资源 (80+ 文件)
- 3 Flutter apps × (5 Android mipmap + 15 iOS AppIcon + 3 LaunchImage + 2 assets)
- admin-web: favicon.ico/png, logo.png, logo_icon.png, icon-512.png, SVG源文件
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 08:00:19 -08:00
hailin
295ebcdac7
feat(branding): 全平台品牌Logo替换 — 新双色渐变券印标识
...
## 概述
将全平台(5个前端应用)的品牌Logo从旧版钻石图标统一替换为新设计的
双色渐变券印标识(紫色#9B5CF6 + 品红#D946EF),体现券金融平台定位。
## 新Logo资源
- logo/genex-icon.svg: 纯图标(72x72),用于App图标和favicon
- logo/genex-04.svg: 带品牌名(380x72),用于启动画面和品牌展示
## 替换范围
### Flutter Apps(genex-mobile / admin-app / mobile)
- Android: 5个密度mipmap ic_launcher.png (48~192px)
- iOS: 15个AppIcon尺寸 (20~1024px) + 3个LaunchImage尺寸
- assets/images/: 新增 logo.png(760x144) + logo_icon.png(192x192)
- pubspec.yaml: 新增 assets 声明
- welcome_page.dart: Icons.diamond_rounded → Image.asset('logo_icon.png')
- issuer_login_page.dart: Icons.storefront_rounded → Image.asset('logo_icon.png')
- issuer_dashboard_page.dart: 同上
- settings_page.dart: 同上
### admin-web(Next.js 15)
- public/: favicon.ico/png, logo.png, logo_icon.png, icon-512.png, SVG源文件
- layout.tsx: 更新metadata icons配置
- AdminLayout.tsx: 侧栏inline "G"文字 → <img src="/logo_icon.png">
### miniapp(Taro/React 小程序)
- login/index.tsx: "G"文字Logo → CSS双色分割旋转方块
- share-card/index.tsx: 同上 + 品牌色从#6C5CE7更新为#9B5CF6/#D946EF
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 04:07:46 -08:00
hailin
9fdb5acaa8
feat(chain): 添加 init-fullnode.sh — 非创世节点初始化脚本
...
全节点只需: genexd init + 复制 genesis.json + 配置 peers
区块数据通过 P2P 从创世节点同步,不需要重新执行 genesis 初始化
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 08:50:20 -08:00
hailin
5f474c87b9
fix(chain): 恢复 timeout_commit sed 命令, 确保 1s 出块
...
genexd init 生成的 config.toml 默认 timeout_commit=5s,
initCometConfig() 的代码设置仅在首次生成模板时生效,
不会覆盖已有 config.toml。必须通过 sed 显式修改。
验证结果: 40 blocks/30s = 0.75s/block ✓
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 08:48:04 -08:00
hailin
20d9e10d26
fix(chain): 恢复 create_empty_blocks=true, 稳定 1s/块
...
cosmos/evm 链上 create_empty_blocks=false 无效:
EVM EndBlock 每次都改变 app hash → needProofBlock() 始终 true,
链照样出块,设 false 反而引入不稳定延迟 (官方已知问题 ethermint#308)
正确配置: timeout_commit=1s + create_empty_blocks=true
→ 稳定 ~1s/块 (有无交易均一致)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 08:37:31 -08:00
hailin
2cdd7eedcd
fix(chain): 合理化出块参数 — 1s commit, 空块60s心跳
...
出块参数 (对标 dYdX/Injective):
- timeout_commit: 1s → 单验证者 ~0.75s/块, 多验证者 ~1.5-2s
- create_empty_blocks: false + 60s heartbeat interval
- skip_timeout_commit: false (防止空块风暴)
修复: skip_timeout_commit=true 与 create_empty_blocks=false 冲突,
EVM mempool 持续触发 TxsAvailable 导致空块无法停止。
保持 skip=false, 通过 1s timeout_commit 实现快速出块。
空闲时磁盘: ~1440 blocks/day ≈ 2 MB/day (vs 之前 2-3 GB/day)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 08:19:33 -08:00
hailin
8bd74566a7
feat(chain): GNX 代币经济模型 — 总量10亿, 5钱包分配 + 通胀控制
...
代币分配 (总量 1,000,000,000 GNX):
- validator 35% (3.5亿) — 验证者节点, stake 2.5亿
- treasury 20% (2.0亿) — 平台运营/Gas Relayer补贴池
- ecosystem 20% (2.0亿) — 生态发展/DApp激励
- team 15% (1.5亿) — 团队&早期投资者
- community 10% (1.0亿) — 社区治理/DAO储备
通胀参数:
- 初始通胀率: 5%
- 范围: 2%-7%
- 目标staking比例: 50%
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 07:55:15 -08:00
hailin
23055c604c
perf(chain): 禁用空块生产,防止磁盘快速耗尽
...
问题: skip_timeout_commit=true 导致 ~44ms/块,无交易时
空块以 ~23块/秒 速度堆积,约 2-3 GB/天纯空块数据。
修复: create_empty_blocks = false
- 没有待处理交易时不出块
- 有交易提交时立即触发出块,延迟不受影响
- 彻底消除空块造成的磁盘浪费
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 07:50:14 -08:00
hailin
d53203d56e
perf(blockchain): 启用 Optimistic Execution + 共识参数调优
...
性能优化三合一,预计提升单链吞吐 5-10 倍:
1. Optimistic Execution (SDK v0.53 内置):
- 在 ProcessProposal 阶段预执行下一区块
- FinalizeBlock 调用时直接复用预执行结果
- 减少出块延迟约 30-50%
2. 共识参数调优 (init-genesis.sh):
- timeout_commit: 5s → 1s
- skip_timeout_commit: true (单节点收到自己投票后立即提交)
- timeout_propose: 3s → 1.5s
- timeout_prevote/precommit: 1s → 500ms
- 实际出块时间预计 500-800ms
3. 存储和内存池调优:
- IAVL cache: 781,250 → 2,000,000 节点 (适配 16 核 126GB 服务器)
- Mempool size: 5,000 → 10,000 笔交易
- Mempool cache: 10,000 → 20,000 (减少重复校验)
技术背景:
- 当前单链 200-800 TPS (串行执行)
- 优化后预计 1,000-3,000 TPS
- 未来 SDK v0.54 将内置 BlockSTM 并行执行 + IAVLx 存储优化
(Cronos 团队贡献上游化),届时可达 5,000+ TPS
文件变更:
- root.go: 添加 baseapp.SetOptimisticExecution()
- init-genesis.sh: 共识/存储/内存池参数调优
- go.mod/go.sum: go mod tidy 生成完整依赖
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 07:24:21 -08:00
hailin
e8e2d14fbc
fix(health): 修正NestJS服务健康检查URL路径 /health → /api/v1/health
...
NestJS服务注册了全局路由前缀 api/v1,HealthController 实际挂载在
/api/v1/health 而非 /health,导致 Docker HEALTHCHECK 返回 404。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 05:50:26 -08:00
hailin
c5787020d2
feat(health): 为全部12个微服务添加Docker健康检查
...
## 变更概要
所有后端微服务均增加 Docker HEALTHCHECK 指令,统一通过 GET /health
端点检测服务存活状态。解决 `docker ps` 中13个容器无 (healthy) 状态的问题。
## NestJS 服务 (9个)
- auth-service (:3010), user-service (:3001), issuer-service (:3002),
clearing-service (:3004), compliance-service (:3005), ai-service (:3006),
notification-service (:3008), telemetry-service (:3011), admin-service (:3012)
- 7个服务的 app.module.ts 新增 `import { HealthModule } from '@genex/common'`
注册标准健康检查控制器 (GET /health, /health/ready, /health/live)
- telemetry-service 和 admin-service 已有自建 HealthController,无需导入
- Dockerfile: HEALTHCHECK --interval=30s --start-period=15s --retries=3
## Go 服务 (3个)
- trading-service (:3003), translate-service (:3007), chain-indexer (:3009)
- 已有 /health 端点 (Gin 路由),仅 Dockerfile 添加 HEALTHCHECK
- Dockerfile: HEALTHCHECK --interval=30s --start-period=10s --retries=3
## Kafka Connect
- docker-compose.yml 添加 healthcheck (curl http://localhost:8083/ )
## 健康检查方式
- 所有服务统一使用 `wget --spider http://localhost:PORT/health `
(node:20-alpine 和 alpine:3.19 均自带 BusyBox wget)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 05:39:25 -08:00
hailin
0b1de382b0
fix(deploy): 服务器部署修复 — 全栈编译运行通过
...
在内网服务器 (192.168.1.222) 首次部署时发现并修复的所有问题,
涉及 backend (12微服务)、blockchain (Cosmos SDK节点)、前端 (admin-web)。
## Backend 修复
### docker-compose.yml
- DB_PASSWORD: 从硬编码 `genex_dev_password` 改为 `${DB_PASSWORD}` 环境变量插值,
所有13个服务统一从 .env 读取,避免密码不一致导致连接失败
- Kong 镜像: `kong:3.5-alpine` → `kong:3.5`,alpine 版本在 amd64 上缺少依赖
- chain-indexer: 环境变量名 `CHAIN_RPC_URL` → `RPC_URL` (与 Go 代码 getEnv 一致)
- chain-indexer: RPC 地址改为 `http://172.17.0.1:8545 ` (Docker bridge gateway,
跨 docker-compose network 访问 blockchain 节点的 EVM JSON-RPC)
- chain-indexer: 补全缺失的 DB_HOST/DB_PORT/DB_USERNAME/DB_PASSWORD/DB_NAME
### ai-service
- ai.module.ts: 移除重复的 TypeOrmModule.forRootAsync — 该模块错误地使用了
DB_USER/DB_PASS (默认 'genex'/'genex') 和独立数据库 genex_ai,与 app.module.ts
中已有的 TypeOrmModule.forRoot 冲突,导致密码认证失败
- app.module.ts: 添加 ConfigModule.forRoot({ isGlobal: true }),因为
JwtModule.registerAsync 依赖 ConfigService 注入
### 依赖补全
- user-service/package.json: 添加 kafkajs ^2.2.4 (Kafka 事件消费)
- admin-service/package.json: 添加 kafkajs ^2.2.4 (Kafka 事件消费)
## Blockchain 修复
### genex-chain/app.go — 修复 chainConfig panic
- 问题: NewGenexApp 被调用两次 (tempApp 注册编码 + 实际启动),cosmos/evm 的
SetChainConfig 在第二次调用时 panic: "chainConfig already set"
- 原因: 原代码 `if evmChainID == 0 { evmChainID = GenexEVMChainID }` 导致
tempApp 也使用 8888,SetChainConfig 设置后,实际 app 再次设置时触发 panic
- 修复: 移除默认值回退,让 tempApp 使用 evmChainID=0 → DefaultEVMChainID(262144),
实际 app 从 app.toml 读取 8888 后可正常覆盖
### genex-chain/cmd/genexd/cmd/root.go
- 移除未使用的 banktypes import (编译错误)
### docker-compose.yml
- 添加 `command: ["start", "--chain-id", "genex-testnet-1"]` 到 x-genex-node 默认配置,
否则 InitChain 时 chain-id 为空导致校验失败
### init-genesis.sh (新增)
- 创世初始化脚本: init → 补丁 genesis.json → 创建验证者 → gentx → collect-gentxs
- 将所有默认 denom (aatom) 替换为 agnx (GNX, 18 decimals EVM 兼容)
- 配置: evm_denom, bond_denom, mint_denom, gov min_deposit, bank denom_metadata
- 启用 JSON-RPC (0.0.0.0:8545/8546)、REST API、CORS
- 设置 evm-chain-id=8888
## 部署结果
- 20 个 Docker 容器全部运行 (4 基础设施 + 12 后端 + 1 区块链节点 + 1 前端 + 2 辅助)
- 区块链稳定出块 (height 80+),EVM JSON-RPC 正常
- chain-indexer 实时索引区块 (lag=0)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 05:29:33 -08:00
hailin
8e9ee1d38b
fix(docker): 端口避让 + admin-service依赖修复
...
- 所有端口改为不冲突范围: 基础设施4xxxx, 服务4xxx
- admin-service添加adbkit-apkreader/unzipper/bplist-parser依赖
- 修复Platform类型推断
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:34:24 -08:00
hailin
2f583a0a24
fix(admin-service): 添加APK/IPA解析依赖 + 修复Platform类型推断
...
- 添加adbkit-apkreader, unzipper, bplist-parser
- 修复platform变量类型为Platform枚举
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:58:12 -08:00
hailin
c42827c6c1
fix(backend): 修复所有服务编译问题 — tsconfig宽松化 + 补全缺失依赖
...
- 所有tsconfig.json: strict改为false, 移除paths映射(改用node_modules解析)
- compliance/clearing/ai/notification: 添加缺失的@nestjs/passport和@nestjs/jwt
- ai-service: 添加缺失的@nestjs/config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:20:48 -08:00
hailin
a31c1aa478
fix(common): 修复@genex/common包TypeScript编译错误
...
- current-user.decorator: 移除显式返回类型以兼容undefined字段访问
- http-exception.filter: 为message变量提供默认值避免TS2454
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:04:21 -08:00
hailin
d48bd3acb9
feat(docker): 重构Monorepo构建 — 支持@genex/common共享包
...
- docker-compose.yml build context从service目录改为backend根目录
- 所有NestJS Dockerfile改为先构建共享@genex/common包
- 共享包编译后复制到service的node_modules供运行时解析
- 新增backend/.dockerignore减少构建上下文体积
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:00:27 -08:00
hailin
d146bf0a1f
fix(tsconfig): 关闭strictPropertyInitialization以兼容TypeORM实体
...
TypeORM实体使用装饰器定义属性,不在构造函数中初始化。
strict:true隐式启用strictPropertyInitialization导致TS2564编译错误。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:48:48 -08:00
hailin
12bb31ede1
fix(docker): 所有NestJS服务Dockerfile使用npm install替代npm ci
...
项目未包含package-lock.json,npm ci要求该文件存在才能运行。
改用npm install确保Docker构建正常完成。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:33:31 -08:00
hailin
c11d009ae7
fix: admin-service/telemetry-service Dockerfile 改为多阶段构建
...
修复缺少 builder 阶段导致 COPY dist/ 找不到目录的问题
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:29:56 -08:00
hailin
bc0d1e0876
feat: 新增 deploy.sh 部署管理脚本体系 — 后端主控+12服务独立+区块链
...
参照 rwadurian 项目模式,为全栈系统创建统一的 deploy.sh 管理体系:
- backend/deploy.sh: 主控脚本 (up/down/restart/build/build-no-cache/health/infra-*/单服务操作)
- 12个服务独立 deploy.sh (build/rebuild/start/stop/restart/logs/health/shell/test)
- blockchain/deploy.sh: 节点+生态+合约+浏览器+监控全覆盖
- 更新 09-编译部署指南.md 新增第9章 deploy.sh 使用文档
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:13:09 -08:00
hailin
cc4d3d11f8
docs: 新增09-编译部署指南 — 全栈编译、运行与生产部署完整文档
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 16:54:03 -08:00
hailin
be3555f338
fix(chain-indexer): 替换Mock为真实区块链RPC索引 — 接入Genex Chain EVM节点
...
## 背景
chain-indexer(:3009)此前使用Mock模式,每10秒生成假区块数据(hash为纯数字填充,
txCount固定为0),未连接任何真实区块链节点。这是整个区块链架构中唯一的功能缺口
(8大核心服务中TX Indexer完成度仅85%)。
## 改动内容
### 新增文件
- internal/domain/repository/chain_client.go
DDD领域接口ChainClient,定义GetLatestBlockNumber/GetBlockByNumber/Close三个方法,
遵循依赖倒置原则,应用层不依赖具体RPC实现
- internal/infrastructure/rpc/eth_client.go
EthChainClient实现,基于go-ethereum/ethclient:
· ethclient.Dial()连接EVM JSON-RPC节点
· BlockByNumber()获取完整区块(hash/timestamp/txCount)
· types.LatestSignerForChainID()恢复交易发送方地址
· TransactionReceipt()获取交易执行状态(confirmed/failed)
### 修改文件
- go.mod: 新增github.com/ethereum/go-ethereum v1.14.8依赖
- internal/application/service/indexer_service.go
· 注入ChainClient依赖,移除所有Mock逻辑
· 轮询间隔10s→2s(匹配链~1s出块时间)
· 批量追赶:每周期最多索引50个区块,快速消化落后高度
· 新增GetChainHeight()/IsSynced()方法供API层使用
· 区块+交易分别持久化,每条交易独立发布Kafka事件
- cmd/server/main.go
· 新增RPC_URL环境变量(默认http://localhost:8545 )
· 初始化EthChainClient并注入IndexerService
· /api/v1/chain/status返回真实chainHeight和syncing状态
- internal/interface/http/handler/admin_chain_handler.go
· GetContracts: 合约列表更新为真实11个已部署合约(与genex-contracts对齐)
· GetGasMonitor: Gas数据全部归零(Genex Chain min_gas_price=0平台补贴)
· GetChainStats: 使用真实chainHeight计算indexerLag/tps/indexerStatus
· chainId修正88888→8888,consensusType修正PoA→CometBFT
## 环境变量
RPC_URL=http://localhost:8545 (Docker内使用 http://genex-node-1:8545 )
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 18:04:18 -08:00