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_sign和wuxing_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,更新status为COMPLETED。
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 的处理管道:
- 鉴权与限流: 查
ai_chat_quotas表,超过 20 条拦截请求。
- 提取上下文 (Memory): 使用
BufferWindowMemory提取最近的 10 条对话历史。
- 构建 PromptTemplate (核心特训):
将用户的
users表标签注入 Prompt。 System Prompt 示例:
"你是一位名叫'星语'的灵性疗愈师。你正在与一位【INTJ型】人格、八字主属性为【乙木】的用户对话。该用户今日五行【缺火】,能量值偏低(45分)。请用温和、富有洞察力且带有一点神秘学色彩的语气回复他。不要超过150字。"
- 调用 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,并在对应的资产表中添加记录。
💡 后端开发建议与排雷指南
- 关于运势和八字的算法:
不要试图让 AI 去实时计算八字排盘(大模型不擅长做绝对精确的数学推演)。你应该在 Node.js 中引入开源的中国农历/八字库(如
lunar-javascript),在代码层面算出确切的“五行属性”和“喜忌”,然后再把这些确定的词语作为变量,喂给 LangChain 去生成人性化的文本。
- 抽卡防作弊机制:
用户可能会为了集齐 NFT 图鉴而恶意刷接口。在
POST /api/v1/tarot/draw接口中,必须加上 Redis 分布式锁和当日抽卡次数校验。
- 数据库选型优势:
使用 PostgreSQL 的巨大优势在于,如果你未来要开发 【引力社交】 板块,你可以直接开启
PostGIS插件,它能以极高的效率计算坐标距离,实现“附近 3km 与你星盘契合度 90% 的星友”这种高级 LBS 查询,不需要额外部署其他空间数据库。
- Author:Ashland
- URL:http://preview.tangly1024.com/article/313cccc0-3782-80e8-84b1-f83aef3f6c95
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!




