这套工程不是模板改皮,而是一条能跑通交易的链路:用户注册 → 充值(比索代收或 USDT)→ 买商品 → 扣库存 → 订单进后台 → 管理员发货 → 用户在「我的密钥」里拿到 API Key。代码 120 个文件、0.52 MB,没有一处加密混淆。

技术栈

  • Next.js 16.3.4(App Router)+ React 19.2.8 + TypeScript
  • Prisma 5.22 + SQLite(file:./prod.db,单文件数据库,备份就是拷一个文件)
  • Tailwind CSS 4 + 自绘组件,无 UI 框架依赖
  • 依赖极少:@prisma/client、bcryptjs、jsonwebtoken,加上框架本身

8 张数据表,把「卖密钥」这件事拆干净

模型作用
User账号、密码摘要、角色、余额、VIP 等级
UserKyc实名资料与审核状态
VipTierVIP 等级与「每月可下单数」
Deposit充值单:金额、币种、支付地址、txHash、状态
Product商品:价格、库存、上游 Key 池、限购
Order订单:订单号、联系方式、支付方式、状态
ApiKey已发放的密钥(与订单、用户挂钩)
Setting站点设置、支付配置、USDT 地址等键值

迁移文件齐全(6 个 migration.sql,从 init 到 add_user_kyc、usdt_deposit),prisma migrate deploy 一条命令建库。

两条收款通道,逻辑分开写

  • NekPayment 代收(墨西哥比索):下单生成 payUrl,用户跳转支付;回调统一进 /api/pay/notify,先验签再处理。订单号和充值单号共用一个回调入口——D 开头的单号走「充值到账」,其余走「订单置为已支付」,靠前缀分流,避免两套回调各自出错。
  • USDT-TRC20 充值:1 USDT = 1 USD,用户提交金额与 txHash,系统校验哈希格式后登记为待审,由管理员在后台人工核对到账。这点要说清楚:它是「人工审核到账」,不是链上自动监听,别指望打款秒到。

付款方式还支持余额直扣:余额够就直接扣款并把订单置为已支付,不经过第三方。所有下单都受 VIP 每月可购单数限制(按当月已支付订单统计),超限直接拒单。

密钥安全:上游 Key 加密落库

src/lib/aes.ts 用 AES-256-GCM 加密上游 Key,主密钥来自环境变量 ENC_KEY;库里存的是密文,管理员在后台点「发货」时才解密写进 ApiKey 表并绑定用户。也就是说:数据库被拖走,没有 ENC_KEY 也拿不到上游 Key。这是同类小系统里很少见的一步。

鉴权是常规但正确的写法:bcryptjs 存密码(cost 10)、jsonwebtoken 签会话、后台入口校验 role === "admin",不是只判断「有没有登录」。

前台 8 页 / 后台 9 个模块

  • 前台:首页(商品列表)、登录、注册、商品详情、订单详情、充值、KYC 验证、我的订单 / 我的密钥
  • 后台:总览、商品、订单(发货 / 改状态 / 退款)、充值(通过 / 驳回)、会员(改余额 / 改 VIP)、KYC 审核、密钥库、VIP 等级、站点设置
  • API 路由 30+:auth 4 个、orders 4 个、deposits 3 个、kyc 2 个、pay/notify 1 个、admin 20 个,全部 App Router 风格

三语 + 部署脚本

src/i18n/dictionaries.ts 内置 中文 / 英文 / 西班牙文 三套词条(33 KB),西语不是凑数——配合比索收款,显然是给拉美市场用的。上线脚本也备齐了:

  1. scripts/create-admin.mjs 建管理员、seed-products.mjs 灌演示商品、backup-db.sh 备份 SQLite
  2. ecosystem.config.js(PM2)或 systemd + nginx 反代,next start -p 3000
  3. 自带 .gitea/workflows/deploy.yml,push 到 main 就自动部署
  4. 环境变量三个必改项:JWT_SECRET(openssl rand -base64 48)、ENC_KEY(openssl rand -base64 32)、DATABASE_URL

体检结论(工具实测)

  • 120 个文件 / 0.52 MB,0 处高危执行调用、0 处中危注入入口、0 处硬编码密钥
  • 无加密无混淆,src/ 全量 TypeScript 可读可改
  • .env.example 里三个密钥都是空值占位,没有把真实配置打进包(这点很关键,很多包会带 .env)
  • 无 node_modules,装依赖约 600 个包,Node 20 以上可跑

要注意的三件事

  1. SQLite 是单机方案:并发高、或要多实例部署时换成 Postgres,改动集中在 prisma/schema.prisma 的 datasource 与连接串。
  2. 回调必须公网可达且 https:NEKPAY_NOTIFY_URL 填错会导致「付了钱订单不置位」,本地调试建议用内网穿透。
  3. USDT 充值靠人工:审核环节在 /admin/deposits,没有链上监听,量大了要么加节点监听、要么接第三方回调。

适合谁:做 API 转售、卡密/额度类虚拟商品、需要「充值 → 下单 → 发货」闭环的人。要改的东西也很明确——换商品、换支付通道、换语言,业务层几乎不用动。

同类逻辑的系统可以对照 综合源码栏目;如果想看带后台控盘的商城风格,可参考 Web3 抢单 DApp 站 v2.0 的数据层做法。