Lazy loaded image
APP项目
StarOrbit (星轨) - 后端架构与接口文档 (v2.0)
Words 2017Read Time 6 min
2026-2-26
2026-2-26
type
Post
status
Published
date
Feb 26, 2026
slug
summary
tags
category
APP项目
password

一、 全局后端架构与技术栈

  • 核心框架: NestJS (Node.js 生态中最严谨、最适合全栈工程师的企业级框架)
  • 数据库与 ORM: PostgreSQL (Supabase 提供) + Prisma (实现极度丝滑的 DB 迁移和 TS 类型推导)
  • AI 逻辑层: LangChain.js (处理 Prompt 模板封装、上下文记忆与大模型交互)
  • 存储服务: 阿里云 OSS / AWS S3 (用于存储用户打卡上传的图片和女巫动画的静态资源)
  • 鉴权机制: JWT (JSON Web Token)

二、 核心业务模块拆解 (DB 字段 & API 接口)

模块 1:User Profile (迎新与灵境档案)

负责用户时空锚点(生辰)的解析与标签化。
📊 数据库表设计:users (用户主表) | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | id | UUID | 主键 | | phone / openid | String | 手机号或三方登录 ID | | birth_time | DateTime | 降生时间(精确到分) | | birth_location | String | 降生坐标(经纬度或城市名) | | zodiac_sign | String | 星座(后置计算得出,如 'SCORPIO') | | wuxing_core | String | 五行主属性(如 'WOOD' 乙木) | | mbti_type | String | MBTI(如 'INTJ',深度测试后更新) | | has_deep_soul_tested | Boolean | 是否已完成“深度灵魂勘测”(默认 false) | | star_coins | Int | 星币余额(商城代币) |
🔌 核心 API 接口:
  • POST /api/v1/auth/login - 用户登录/注册,发放 JWT。
  • POST /api/v1/users/onboarding - 提交基础时空锚点,后端在此接口内部调用玄学算法库,计算出 zodiac_signwuxing_core 并存入数据库。
  • POST /api/v1/users/deep-test - 提交深度灵魂勘测问卷,更新 mbti_type 等进阶标签,并将 has_deep_soul_tested 设为 true。

模块 2:Metaphysics Engine (今日罗盘与能量引擎)

这是首页的核心,负责计算每日运势和五行状态。
📊 数据库表设计:daily_energies (每日能量快照)说明:记录用户每天的能量状态,用于绘制“运势波动图”。 | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | id | UUID | 主键 | | user_id | UUID | 关联用户 | | record_date | Date | 记录日期 | | lacking_element | String | 当日匮乏的元素(如 'FIRE',前端据此渲染烤火女巫) | | energy_score | Int | 当日综合能量分 (0-100) |
🔌 核心 API 接口:
  • GET /api/v1/dashboard/daily-status - 获取今日状态。返回当日匮乏的五行元素、能量分数、匹配的周边星座。
  • GET /api/v1/dashboard/energy-trend - 获取近 7 日能量趋势,供前端波动图渲染(仅深度测试用户可调用)。

模块 3:Destiny Tarot (命运塔罗与藏品打卡)

核心互动与留存模块。具备高度的“NFT 藏品”属性。
📊 数据库表设计 1:tarot_templates (塔罗卡池字典) | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | id | Int | 卡牌 ID | | title | String | 卡片标题(如“现世慰藉”) | | content | String | 基础指引文案 | | element_tag | String | 关联标签(如 'FIRE',缺火时提高抽中概率) | | rarity_stars | Int | 星级 (1-5 星) | | ui_cover_url | String | 卡面底图 URL |
📊 数据库表设计 2:user_tarot_collections (用户抽卡与打卡记录) | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | id | UUID | 流水号 | | user_id | UUID | 所属用户 | | tarot_id | Int | 关联的卡牌模板 ID | | draw_time | DateTime | 抽取时间 | | status | Enum | 状态:PENDING (待结束), COMPLETED (已完成) | | memory_image_url | String | 打卡上传的图片地址 | | memory_text | String | 打卡心情感悟 | | completed_at | DateTime | 任务完成时间戳 |
🔌 核心 API 接口:
  • POST /api/v1/tarot/draw - 每日抽卡动作。
    • 后端逻辑: 查阅用户的 daily_energies,如果缺火,则在 tarot_templates 中加大火属性卡牌的权重进行随机抽取,返回卡牌详情。
  • POST /api/v1/tarot/:id/complete - 完成任务并打卡。接收前端传来的图片文件和文字,上传至 OSS,更新 statusCOMPLETED
  • GET /api/v1/tarot/gallery - 获取个人的塔罗藏品馆列表(分页),按时间或星级排序,供前端双列瀑布流渲染。

模块 4:LangChain AI (灵犀指引)

利用 LangChain 打造具备玄学人设和长记忆的 AI 伴侣。
📊 数据库表设计:ai_chat_quotas (AI 互动限额表) | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | user_id | UUID | 关联用户 | | date | Date | 日期 | | messages_used | Int | 今日已发送条数(每日上限 20) |
🔌 核心 API 接口:
  • POST /api/v1/ai/chat/stream - 情感树洞对话接口(支持 Server-Sent Events 流式返回,实现前端打字机效果)。
🧠 LangChain 后端处理逻辑剖析: 在 NestJS 服务中,你会这样构建 LangChain 的处理管道:
  1. 鉴权与限流:ai_chat_quotas 表,超过 20 条拦截请求。
  1. 提取上下文 (Memory): 使用 BufferWindowMemory 提取最近的 10 条对话历史。
  1. 构建 PromptTemplate (核心特训): 将用户的 users 表标签注入 Prompt。 System Prompt 示例:
    1. "你是一位名叫'星语'的灵性疗愈师。你正在与一位【INTJ型】人格、八字主属性为【乙木】的用户对话。该用户今日五行【缺火】,能量值偏低(45分)。请用温和、富有洞察力且带有一点神秘学色彩的语气回复他。不要超过150字。"
  1. 调用 LLM: 将构建好的 Prompt 发给模型,以 Stream 形式返回给前端。

模块 5:Interstellar Mall (星际补给站)

变现与增值服务。
📊 数据库表设计:products (商品表) | 字段名 (Field) | 类型 (Type) | 说明 (Description) | | :--- | :--- | :--- | | id | String | 商品 ID (如 'WITCH_SKIN_01') | | type | Enum | 类型:SKIN (女巫皮肤), TAROT_PACK (专属卡包), SERVICE (深度人生规划解析) | | price_coins | Int | 价格 (星币) |
🔌 核心 API 接口:
  • GET /api/v1/mall/products - 获取在售商品列表。
  • POST /api/v1/mall/purchase - 购买商品,扣减 users 表的 star_coins,并在对应的资产表中添加记录。

💡 后端开发建议与排雷指南

  1. 关于运势和八字的算法: 不要试图让 AI 去实时计算八字排盘(大模型不擅长做绝对精确的数学推演)。你应该在 Node.js 中引入开源的中国农历/八字库(如 lunar-javascript),在代码层面算出确切的“五行属性”和“喜忌”,然后再把这些确定的词语作为变量,喂给 LangChain 去生成人性化的文本。
  1. 抽卡防作弊机制: 用户可能会为了集齐 NFT 图鉴而恶意刷接口。在 POST /api/v1/tarot/draw 接口中,必须加上 Redis 分布式锁和当日抽卡次数校验。
  1. 数据库选型优势: 使用 PostgreSQL 的巨大优势在于,如果你未来要开发 【引力社交】 板块,你可以直接开启 PostGIS 插件,它能以极高的效率计算坐标距离,实现“附近 3km 与你星盘契合度 90% 的星友”这种高级 LBS 查询,不需要额外部署其他空间数据库。
上一篇
StarOrbit 星轨相关难点记录
下一篇
🌌 StarOrbit (星轨) - 前端开发文档 (v2.0)