orion-key 是一个 MIT 协议、400+ star 的自动发卡平台:Next.js 前台、Spring Boot 后端、PostgreSQL 数据库,pnpm workspaces 管理整个 monorepo。它解决一件事——下单支付后自动把卡密发出去,中间零人工,外围配了卡密批量导入、购物车、订单查询、站点配置开关。
是什么
前台有首页、商品、购物车、订单、支付五类页面;管理后台有仪表盘加商品/卡密/订单/用户/站点配置管理,后端 JPA 实体 16 张表。认证是 JWT 加 BCrypt,风控带 IP 限流、登录防爆破、订单频控。支付渠道要看清再选型:支付宝和微信支付当前走「易支付集成」即第三方易支付平台接入,原生直连在 README 里明确标注待实现;USDT 走 BEpusdt 自托管、链上自动确认。要官方直连的得自己补代码。订单查询对游客和会员都开放,凭订单号查发货结果;USDT 订单的返回里还带 TXID 审核状态,链上款对不上时用户能自己看到原因。
技术栈与部署
README 列的先决条件:Java 22+、Maven 3.9+、Node.js 20+、pnpm 9+、PostgreSQL 18+(库和用户要提前建好)。推荐 Docker 部署,compose 编排 api / web / bepusdt 三个容器,不含 PostgreSQL 和 Nginx,镜像发布在 GHCR 公开仓库:
cp .env.example .env
docker compose pull
docker compose up -d
docker compose logs -f
非 Docker 直跑:apps/api 下 mvn spring-boot:run(端口 8083),apps/web 下 pnpm install、pnpm dev(端口 3000),next.config.mjs 用 rewrites 把 /api/* 代理到 8083,跨域不用处理。验证打 GET /api/health。前端也可以在仓库根目录 pnpm install 后 pnpm dev:web 一键起。上传目录以卷挂载 ./uploads 持久化,容器重建不丢文件;生产建议把镜像固定到具体版本 tag,在 .env 里用 API_IMAGE / WEB_IMAGE 覆盖,方便回滚。配置集中在 application.yml,所有项支持 ${ENV_VAR:默认值} 环境变量覆盖;首次启动 ddl-auto: update 自动建表,再执行一次 data.sql 写入管理员和站点配置。
值得抄的三点
一、FOR UPDATE SKIP LOCKED 抢卡。CardKeyRepository.findAndLockAvailable 是一段原生 SQL:按创建时间升序取指定数量的 AVAILABLE 状态卡(商品加规格两个维度匹配),锁行并跳过已被别的订单锁住的行。并发订单各拿各的卡,不会互相排队;拿不够数抛缺货异常,事务整体回滚,订单停在 PAID 等补货,不会出一半。
二、发货按状态机幂等。入口先 findByIdForUpdate 行锁订单,再按状态分支:已 DELIVERED 的直接返回原发货卡密组,PAID 的才分配——注释里写明这把锁就是防同一笔已付订单被并发请求发双份卡;PAID 分支里过期订单直接按 EXPIRED 返回空发货组,不再占卡。晚到的重复回调空跑一趟,拿回同样的结果。邮件通知注册在事务 afterCommit 回调里,提交成功才发,不会出现「邮件出了、订单回滚了」。
三、卡密导入按批次记录、按内容去重。导入时 existsByContentAndProductId 在商品加规格维度查重,同一张卡不会二次入库;CardImportBatch 实体把一批导入单独记账,配合按状态 GROUP BY 的统计查询,每批卡进了多少、还剩多少一目了然。data.sql 的初始化 INSERT 全部带 WHERE NOT EXISTS,重跑不产生重复管理员或重复站点配置。
别踩的坑
一、security.password-plain 默认 true,也就是密码明文存库(README 说明是给本地调试用的)。生产切 false 启用 BCrypt 之前必须先重置所有用户密码,README 专门叮嘱了这句,顺序错了登录直接坏掉。
二、时区。Docker 部署时 compose 已注入 TZ=Asia/Shanghai;非 Docker 直跑不设置 TZ 环境变量,订单时间、过期判断、链上确认全部偏差 8 小时——README 用醒目段落警告了这一点。
三、ddl-auto: update 意味着让 JPA 直接改表结构,仓库里没有 Flyway 这类迁移工具,生产环境的 schema 演进流程 README 没写,得自己补。
许可证
MIT,版权行署名 Riven:可以使用、复制、修改、再分发,商用也被允许,但必须保留版权声明。README 里夹着作者的赞助位和合作链接,做衍生版本前记得清理掉。



















- 最新
- 最热
只看作者