返回精选项目

Full-stack Product · 2025–2026

Ovanta

跨区域签证、移民与海外身份自助申请平台。

面向中国及国际用户的签证、移民与海外身份自助申请平台,一套核心代码支撑国内版与国际版,覆盖结构化内容、区域化登录支付与会员权益,已上线 ovanta.cn。

业务问题与个人职责

业务问题:把分散、专业且持续变化的官方政策组织为可审核、可组合的结构化指南,并通过订阅、支付与权益完成商业化交付。我主导内容模型、区域化与支付幂等设计。

系统链路

  1. 政策内容
  2. 结构化建模
  3. 资格评估
  4. 订阅支付
  5. 权益发放
  6. 顾问服务
  7. 运营回流

工程重点

Content System
16 类内容模型与类型化组件,支撑多产品、200+ 页面统一编辑与发布。
Payment Hook Chain
支付回调走阻断型 Hook 链:验签、金额、状态机与幂等校验——写侧阻断、读侧降级。
Regional Architecture
国内/国际共享核心业务代码,构建期区域配置 + 渠道适配器,区域重复开发大幅下降。

可验证证据

Content Models
16 模型 · 25 组件 · 200+ 页面
Entitlements
对账一致率 99.9%+ · 千次级回放零重复发放
Events API
P95 < 100ms · 重复率 < 0.1%
E2E
Given-When-Then 通过率 ≥ 98%

React · Vite · Django · DRF · Strapi · MySQL · PostgreSQL · Redis · Celery · Docker Compose · Cloudflare

设计取舍

  1. 把政策做成结构化内容模型,而不是富文本长文

    为什么
    一篇富文本很难知道哪项材料已经过期、当前评估依据的是哪个版本,也无法稳定控制会员可见章节。
    代价
    Strapi/PostgreSQL 与 Django/MySQL 之间形成跨系统边界,内容模型每扩展一次都要同步改两侧。
  2. 国内版与国际版共享核心业务代码,差异收敛到构建期配置

    为什么
    两套代码会立刻分叉,而订单、支付、权益恰恰是最需要保持一致的部分——一旦分叉就再也收敛不回来。
    代价
    区域差异被压进配置与适配器,运行时的分支判断变多;区域特有的产品需求要先评估是否值得进主干。
  3. 支付回调走阻断型 Hook 链:验签、金额、状态机、幂等逐层校验

    为什么
    支付回调天然会重复、乱序、延迟到达,任何一步校验缺失都会直接变成多发或少发权益。
    代价
    回调链路变长,异常路径要单独设计降级与人工介入;对账从此是一项必须长期运行的独立能力。
  4. 权限以服务端校验为准,前端展示状态不作为依据

    为什么
    前端隐藏一个入口不等于用户没有权限——把展示当授权,等于把权限边界交给浏览器。
    代价
    每个需要展示态的功能都要服务端再查一次权限,接口数量和往返次数增加。

系统不负责清单

刻意划出的非目标。写下来的边界才是能守住的边界。

  • 不代替政府部门受理或审批申请
  • 不保证签证、移民、永久居民或开户结果
  • 不在缺乏依据时自动作出专业法律判断
  • 不替代顾问完成必须由人工判断和把关的工作
  • 不自动从非权威来源生成并直接发布政策内容
  • 不让 AI 直接修改内容、资格规则、价格、套餐和权益配置
  • 不把运营数据的相关性自动解释为确定因果关系
  • 不通过前端展示状态代替服务端的真实权限校验
  • 不自行处理支付清算——资金仍由合规支付渠道完成

开放问题

目前还没有答案的部分。欢迎就其中任何一条追问。

  • 内容模型的覆盖度取决于编辑对政策的拆解粒度,跨区域复用时「最小公共模型」还没有稳定答案
  • 支付回调已按幂等键压到千次级回放零重复,但渠道侧对账文件的延迟到达仍需人工兜底
  • 如何在「政策结论必须人工确认」这条线之内提高内容生产效率,目前只在运营侧做聚合解释,还谈不上自动化
  • 区域化适配器把差异收敛进了配置,但新区域接入时本地支付渠道与合规要求仍需逐个评估