PackHorizon · 架构图 & 业务流程图

AI 包装设计决策平台 · Next.js 15 App Router + Prisma + PostgreSQL + Azure OpenAI

① 系统架构

前端 / 页面 API Routes 业务逻辑 / lib 数据 / 存储 外部服务

客户端 · Browser / 微信

官网 (Marketing)
app/(marketing)首页、定价、登录注册入口
用户端 App
app/app/*chat / records / projects / credits / orders / profile
管理后台
app/internal-panel/*系统设置 / 订单 / 用户管理
微信扫码登录
外部网关wx.mvp.restry.cn 共享网关

路由与鉴权 · Next.js Edge

middleware.ts
基于 ph_session / ph_role cookie 控制 /app/*/internal-panel/* 访问
App Router Layouts
marketing / app / internal-panel 三套 layout,分别加载导航与权限上下文
lib/auth
Session 创建、密码 hash (bcrypt)、role 校验

API Routes · app/api/*

auth
POSTregister / login / logout / me
wx
GET/POSTqrcode / callback · 微信扫码
projects
CRUD + /[id]/chat·diagnose·directions·concepts·brief·assets·messages·abort-generation
concepts
GET/[id] · 前端轮询异步出图
assets / uploads / files
本地静态服务 + 访问日志(UPLOAD_DIR
credits
余额、流水、消耗、退款
orders
下单 / 状态 / 支付回执
internal-panel
管理端只读 / 配置
cron
定时任务(退款补偿 / 异步出图清理)
health
存活探针

业务逻辑层 · lib/*

lib/ai
client Azure OpenAI · 指数退避重试
extract 对话抽取元信息(≤3 追问)
diagnose 多模态包装诊断 + 2-3 方向
concept gpt-image-2 异步出图
brief 设计 Brief 生成
prompts 系统提示词集中管理
lib/auth · lib/api
会话、密码、统一错误码、Zod 校验
lib/credits · lib/system-settings
积分计费、退款补偿(RefundOutbox)、可配置定价
lib/uploads · lib/rate-limit · lib/db
本地文件、登录限流、Prisma client(单例)

数据层 · Prisma + PostgreSQL

User
邮箱/密码 · 角色 · 微信 openId
Session
ph_session cookie 映射
Project
设计项目主体
ConversationMessage
对话消息持久化
Asset
pack_front / 参考图
AssetAccessLog
下载/查看审计
Diagnosis
AI 包装诊断结果
Direction
2-3 个优化方向
Concept
概念图 · 异步状态机
Brief
最终设计 Brief
Order / Payment
订单 + 支付凭证
CreditLog
积分流水
WxFinalizeLog / Nonce
微信支付幂等
RefundOutbox
退款最终一致
RateLimitAttempt
登录/操作限流
SystemSetting
可热更新配置

外部服务

Azure OpenAI
text gpt-5.4 (chat + vision)
image gpt-image-2 1024² high
统一指数退避 / 错误码 502/503
微信网关
wx.mvp.restry.cn扫码登录 · 支付下单 / 回调 / 退款
本地对象存储
UPLOAD_DIR默认 /var/lib/packhorizon/assets · 经 /uploads 静态服务
PostgreSQL
Prisma migrate · .env 注入 DATABASE_URL

② 核心业务流程:从对话到设计 Brief

用户从「描述需求」到「拿到设计 Brief」的主链路,括号中为对应 API 与 Prisma 实体。

1

登录 / 注册

邮箱密码或微信扫码登录,写入 ph_session

POST /api/auth/* · /api/wx/*
2

新建项目 + 对话

AI 抽取品类/受众/目标,最多 3 个追问澄清。

POST /api/projects · /[id]/chat
3

上传包装图

至少 1 张 pack_front,落到 Asset + 本地存储。

POST /[id]/assets
4

AI 包装诊断

多模态分析(图+文),同时产出 2-3 个优化方向。

POST /[id]/diagnose
5

选定方向

用户勾选 1 个或多个 Direction,触发后续出图。

PATCH /[id]/directions/[did]
6

异步生成概念图

gpt-image-2 1024² · 立即返回 pending,前端轮询。

POST /[id]/directions/[did]/concepts
7

生成设计 Brief

合并诊断 + 方向 + 概念图,输出最终交付。

POST /[id]/brief
A

积分扣费(横向贯穿)

诊断 / 出图 / Brief 各步在调用前 reserve,成功 commit,失败走 RefundOutbox 异步退款补偿。

lib/credits + CreditLog
B

充值 / 订单

积分不足时跳转下单 → 微信支付 → 回调写 Payment / WxFinalizeLog(幂等 nonce)。

/api/orders · /api/wx/*
C

记录 & 继续

「我的记录」可恢复上下文:/app/chat?project=<id>,「继续优化对话」回到 chat。

/app/records · /app/chat
D

管理端介入

internal-panel 可调系统价格、查看订单、人工标记失败的异步任务。

/app/api/internal-panel/*
关键约束:① 步骤 4 必须在步骤 3 之后(400 PRECONDITION_FAILED);② 步骤 6 状态机 pending → succeeded | failed,失败自动退款;③ 所有 AI 调用统一指数退避 max 8 次(base 2s,cap 60s)。

③ 支付 / 积分子流程

1

下单

用户在 /app/credits 选套餐 → 创建 Order(pending)。

POST /api/orders
2

调起微信支付

经共享网关返回 prepay/二维码。

POST /api/wx/order
3

支付回调

WxFinalizeNonce 幂等去重,写 Payment。

POST /api/wx/finalize
4

积分入账

CreditLog +N · 用户余额更新。

lib/credits
5

AI 调用扣费

reserve → 调 AI → commit / rollback。

/api/projects/[id]/*
6

失败补偿

RefundOutbox + cron 重试退款。

/api/cron/*

本图源数据来自仓库 README.mdprisma/schema.prismaapp/api/**lib/**。 打开方式:浏览器直接打开本文件即可,无任何外部依赖。