全部作品
我的个人项目

SolveMY

面向马来西亚的三语本地服务平台,覆盖 Android、iOS 和网页。用户发布需求,经过认证的服务商和商家报价并在线沟通。

角色
技术负责人,端到端独立构建
类型
我自己的个人项目
时间
2026.01 至今
状态
网页与 Google Play 已上线 · 已提交 App Store 审核
访问网站

SolveMY 用英文、马来文和中文,把用户与经过认证的服务商和商家(维修、清洁、运输、美容、补习等)连接起来。整套系统由我搭建并运维:基于 PostgreSQL 与 PostGIS(地理位置搜索)的分层 Go REST API,带服务端渲染 SEO 页面的 Next.js 16 网站,以及 Android 和 iOS 的 Flutter 应用。生产环境运行在自管的 Hetzner 服务器上(Docker、nginx、Let's Encrypt),存储和 CDN 使用 Cloudflare R2,网站部署在 Vercel;预发与生产完全隔离,每晚加密备份,CI 质量门禁和监控齐全。

我做了什么

  1. 01设计分层 Go API(领域、服务、仓储、HTTP),使用 chi 与 pgx:31 个领域服务、235 个接口、1,006 个测试函数,CI 中有 golangci-lint 与 gofmt 门禁。
  2. 02基于 PostGIS 的半径搜索和最近优先排序,覆盖服务商、商家和需求;App 与网站上的商家地图支持图钉聚合。
  3. 03会话安全:短期访问令牌 + 轮换的不透明刷新令牌,检测到重复使用即吊销整个令牌族;按设备管理会话,90 天滑动有效期。
  4. 04基于 Claude API 的 AI 搜索:用英文、马来文或中文的自然语言,或一张照片,匹配到对应类别和子领域。
  5. 0548 个页面的 Flutter 应用已上架 Google Play 并提交 App Store;同一套代码同时满足两大应用商店的定价规则。
  6. 06在 Hetzner 上运维生产环境(Docker、nginx、Let's Encrypt);预发环境作为真正的金丝雀;每晚 AES-256 加密备份到 Cloudflare R2;Sentry、在线监控与证书到期告警。

值得一讲的故事

推送通知在所有设备上静默失效了十天。我从 FCM 错误码追到每条消息都附带的 APNs 配置块,改为仅 iOS 携带,去除重复推送,并新增可按用户证明送达的管理接口。

一张 TLS 证书在域名迁移后续期失败并过期,导致 API “宕机”。我重新签发证书,用 nginx reload 钩子恢复自动续期,并增加每日到期告警,避免再次无声发生。

并发安全的“每人每天只计一次”统计:在 CTE 中对日表执行 INSERT … ON CONFLICT DO NOTHING,重复点击不会重复计数。

兼容旧版 App 的“对所有人删除”聊天功能:软删除,被删除的消息以纯文本加标记返回。

数字

  • 235 个 REST 接口
  • 1,006 个 Go 测试函数
  • 116 个 SQL 迁移
  • 48 个 App 页面 · 75 个网页路由
  • 3 种语言
  • 8 个月 834 次提交

技术栈

  • Go
  • chi
  • pgx
  • PostgreSQL 16
  • PostGIS
  • Next.js 16
  • TanStack Query
  • NextAuth
  • Flutter
  • Riverpod
  • Docker
  • nginx
  • Cloudflare R2
  • Vercel
  • Firebase (FCM / APNs)
  • Twilio
  • Google Maps Platform
  • Claude API
  • GitHub Actions
  • Sentry
需要类似的系统?手机 App 开发(iOS 与 Android)查看相关服务
下一个项目MT5 风控引擎