Skip to content

项目构建

更新时间:2026/9/17 10:54:49

本页详细说明 DaxPay 每个应用的编译、构建产物与启动方式。按后端、Go、前端、小程序四条线组织,每个应用独立成节,包含环境要求、构建命令、产物路径与启动验证。

首次试用

只想快速跑起来体验功能,建议直接走 一键部署,无需本地编译。本页面向需要二次开发或定制部署的场景。

从源码到可运行产物的编译链路,按后端 / Go / 前端 / 小程序四条线各自独立,每条线在正文中独立成节。

启动顺序:中间件 → 主应用 → 通道子应用(可选,二选一语言版) → 前端

获取源码

各应用是独立 git 仓库,按需 clone 到同一父目录下。下文所有 cd 路径均以本节 clone 后的目录名为准:

bash
# 主应用:公开仓库名是 dax-pay,clone 时显式指定目录名 dax-pay-open(与运维面板、文中路径保持一致)
git clone -b 4.0 https://gitee.com/dromara/dax-pay.git dax-pay-open

# 通道子应用(Java 版与 Go 版对等,部署时二选一)
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-channel-one.git
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-channel-one-go.git

# Web 管理端(运营端 + 商户端同源)/ H5 移动端
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-ui.git
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-h5.git

非公开仓库

聚合与国际通道子应用 (dax-pay-channel-two / dax-pay-channel-three) 与 uni-app 三仓 (dax-pay-app-admin / dax-pay-app-merchant / dax-pay-mini-cashier) 不在公开源码清单内,经授权渠道获取;clone 后目录名与文中各节路径一致,无需调整。收银台远端仓库历史名称为 dax-pay-cashier,本地目录统一使用 dax-pay-mini-cashier

环境准备

各应用共同依赖与各自专属依赖汇总如下,按需安装。

环境版本要求适用应用说明
JDK25+所有 Java 后端Java 运行环境(容器化部署可不装,镜像自带)
mvnd最新所有 Java 后端Maven Daemon,加速编译
Go1.26+dax-pay-channel-one-goGo 通道子应用
Node.js^22.13.0 || ^24.0.0所有前端前端构建环境
pnpm>=10.0.0所有前端包管理器(强制,preinstall 会拦截 npm/yarn)
PostgreSQL14+后端运行依赖主数据库(编译不需要,运行需要)
Redis7+后端运行依赖分布式缓存
Apache Artemis最新后端运行依赖JMS 消息队列,支付延时通知

Spring Boot 4.1 编译注意

  • -DskipTests 不再跳过测试的 AOT 处理,必须改用 -Dmaven.test.skip=true
  • PowerShell 下含 =-D 参数必须加引号(如 "-Dmaven.test.skip=true"),否则会被空格拆分

数据库准备

数据库需提前创建(UTF8 编码,public 模式)。各应用使用的库:

应用dev 库名prod 库名
主应用 dax-pay-opendaxpay-devdaxpay-prod
通道子应用(channel-one / channel-two)与主应用同库 daxpay-dev与主应用同库 daxpay-prod

导入初始化 SQL

建库后导入主应用仓库 _config/sql/ 目录下的初始化脚本。导入方式任选,psql 命令行、Navicat / DBeaver 等图形工具均可;关键是执行顺序不能颠倒:先 table.sql 建表结构,再 data.sql 导初始数据。

脚本用途
table.sql全量表结构,全新安装第一步
data.sql全量初始数据(已脱敏),含内置超管账号与菜单,全新安装第二步
update-tables.sql版本升级时的表结构变更
update-datas.sql版本升级时的数据变更

升级脚本不能跨版本

update-* 脚本仅适用于上一版本升级到当前版本,不能跨版本执行;跨版本升级请逐版本执行对应的升级脚本,或直接使用全量脚本重建。

同库说明

通道子应用与主应用共享同一数据库,无需单独建库、单独导 SQL。详细连接配置见 配置说明

首次启动注意

仓库内 application-dev.yml 的连接地址使用 postgresql / redis / mq 主机名(非 localhost),首次启动前需在本机 hosts 中追加 127.0.0.1 postgresql redis mq,或直接改 yml 连接信息。中间件实例的快速启动命令见 项目运行 - 中间件准备

后端应用构建

主应用 dax-pay-open

支付核心后端,承载支付业务、通道路由编排、风控与系统管理。

技术栈:Java 25 · Spring Boot 4.1.1 · PostgreSQL · Redis · Apache Artemis · MyBatis-Plus · Sa-Token · MapStruct

端口:9999

编译

bash
cd dax-pay-open
# 完整打包(产出可运行 jar)
mvnd clean package "-Dmaven.test.skip=true" -T 4

禁止使用 install

mvnd install 会触发全量打包并写入本地 Maven 仓库,输出庞大、耗时长,且经 PowerShell 管道易阻塞卡死。日常构建验证只使用 compile,生产打包使用 package

单模块快速编译(只验证改动涉及的模块,比全量快很多):

bash
cd dax-pay-open
# -pl 指定模块路径,-am 同时编译其依赖模块
mvnd compile -pl daxpay-payment/daxpay-payment-core -am "-Dmaven.test.skip=true"

产物路径:dax-pay-open/daxpay-start/target/daxpay-union.jar

启动

bash
# 开发模式(端口 9999)
cd dax-pay-open/daxpay-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev

# 生产模式(通过 jar 启动)
java -jar daxpay-start/target/daxpay-union.jar --spring.profiles.active=prod

生产环境凭证通过环境变量注入,详见 配置说明 - 生产环境变量清单

验证

bash
curl http://127.0.0.1:9999/actuator/health
# 预期 {"status":"UP"}

启动成功后控制台输出 应用 'dax-pay-open' 运行成功!,dev 环境 API 文档:http://127.0.0.1:9999/swagger-ui/index.html。导入初始化 SQL 后可用内置超管账号登录 Web 运营端,见 项目运行 - 默认登录账号

主应用由六大 Maven 聚合模块组成,依赖方向自上而下(以 daxpay-start 的实际依赖为准):

另有 daxpay-plugin 插件模块(易支付兼容 / 风控),按需引入,不参与默认启动装配。


通道子应用 dax-pay-channel-one

对接支付宝、微信、抖音、银联商务、银联(云闪付)等直连通道的独立部署微服务,承载第三方 SDK 的直接调用。

技术栈:Java 25 · Spring Boot 4.1.1 · 各通道官方 SDK(alipay-sdk / weixin-java-pay / douyinpay / UMS 自研 HTTP / 银联 RSA2 证书签名)

端口:20100

编译

bash
cd dax-pay-channel-one
mvnd clean package "-Dmaven.test.skip=true" -T 4

产物路径:dax-pay-channel-one/daxpay-channel-start/target/daxpay-channel-one.jar

启动

bash
# 开发模式(端口 20100)
cd dax-pay-channel-one/daxpay-channel-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev

# 生产模式
java -jar daxpay-channel-start/target/daxpay-channel-one.jar --spring.profiles.active=prod

验证

bash
curl http://127.0.0.1:20100/actuator/health
# 预期 {"status":"UP"}

与主应用的关系

主应用通过 @HttpExchange 声明式客户端调用本子应用,链路 AES-GCM 加密。需先启动主应用或确保主应用可达。


通道子应用 dax-pay-channel-two

对接聚合通道(拉卡拉、海科融通、斗拱、乐刷、富友等)的独立部署微服务,架构与 channel-one 完全相同,区别在于承载的通道集合。

技术栈:Java 25 · Spring Boot 4.1.1 · 各聚合通道 SDK

端口:20200

编译

bash
cd dax-pay-channel-two
mvnd clean package "-Dmaven.test.skip=true" -T 4

产物路径:dax-pay-channel-two/daxpay-channel-start/target/daxpay-channel-two.jar

启动

bash
# 开发模式(端口 20200)
cd dax-pay-channel-two/daxpay-channel-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev

# 生产模式
java -jar daxpay-channel-start/target/daxpay-channel-two.jar --spring.profiles.active=prod

验证

bash
curl http://127.0.0.1:20200/actuator/health
# 预期 {"status":"UP"}

channel-two 默认启用

主应用默认路由配置中 channel-one / channel-two / channel-three 三个子应用均已启用,无需取消注释。生产环境子应用地址与通道传输密钥分别经 CHANNEL_TWO_BASE_URL / CHANNEL_TWO_TRANSPORT_KEY 等环境变量注入,详见 配置说明 - 通道子应用路由


通道子应用 dax-pay-channel-one-go(Go 版)

与 Java 版 channel-one 完全对等的 Go 实现,端口、路由、响应契约一致,作为通道对接层的另一种语言选择。

技术栈:Go 1.26 · Gin · OpenTelemetry(进程内)· 嵌入式 i18n(10 语种)

端口:20100(与 Java 版相同)

勿与 Java 版同时启动

Go 版与 Java 版端口、路由完全重叠,同时启动会冲突。部署时二选一。

编译

bash
cd dax-pay-channel-one-go
# 编译二进制
go build -o daxpay-channel-one-go ./cmd/server/

启动

bash
# 方式一:直接运行二进制
./daxpay-channel-one-go

# 方式二:go run(开发期)
go run ./cmd/server/

配置加载:默认读取 configs/config.yaml,可通过环境变量 DAXPAY_CONFIG 指定其他路径。

验证

bash
curl http://127.0.0.1:20100/actuator/health
# 预期 {"status":"UP"}

两版关键维度对照:

维度Java 版 channel-oneGo 版 channel-one-go
技术栈Java 25 · Spring Boot 4.1Go 1.26 · Gin · 进程内 OpenTelemetry
端口2010020100(完全重叠)
路由 / 响应契约基准实现与 Java 版完全一致
配置文件application-{dev,prod}.ymlconfigs/config.yaml
通道对接各通道官方 SDK自研 HTTP 签名对接,无第三方 SDK
适用场景生态完整,通道 SDK 现成,适合快速对接更高吞吐、更低内存占用
部署关系二选一,勿同时启动同左

前端应用构建

前置要求

所有前端应用均要求 Node.js ^22.13.0 || ^24.0.0、pnpm >=10.0.0。首次构建前在各应用目录执行 pnpm install

Web 管理端 dax-pay-ui

基于 Vue Vben Admin 5 的 monorepo,同源编译出运营端与商户端两个独立应用,共用 packages/ 框架包与 i18n 架构。

技术栈:Vue 3.5 · Vite 8 · TypeScript · antdv-next · vxe-table 4 · TailwindCSS 4 · vue-i18n · pnpm + Turbo

子应用:

子应用定位dev 端口VITE_APP_CLIENT_CODE
apps/daxpay-admin运营(管理)端6999admin
apps/daxpay-merchant商户端7999merchant

安装与开发

bash
cd dax-pay-ui
pnpm install

# 运营端开发(端口 6999)
pnpm run dev:admin

# 商户端开发(端口 7999)
pnpm run dev:merchant

构建

bash
cd dax-pay-ui

# 构建全部应用(turbo 并行)
pnpm run build

# 单独构建运营端
pnpm -F daxpay-admin run build

# 单独构建商户端
pnpm -F daxpay-merchant run build

产物路径:

子应用产物
运营端dax-pay-ui/apps/daxpay-admin/dist/
商户端dax-pay-ui/apps/daxpay-merchant/dist/

类型检查与代码规范

bash
pnpm run check:type    # turbo run typecheck (vue-tsc)
pnpm run lint          # ESLint

monorepo 内部结构:两个子应用同源不同模式编译,框架层共用:

端身份由 .envVITE_APP_CLIENT_CODE 构建期注入,配合后端实现菜单与数据的端级隔离,详见 配置说明 - Web 管理端


移动 H5 端 dax-pay-h5

单应用同时承载 PC 与移动两套完全独立的页面,由入口设备探测分发;移动端使用 postcss-mobile-forever 做 vw 适配。

技术栈:Vue 3.5 · Vite 8 · Vue Router · Vant 4(移动端)· UnoCSS · Pinia · vue-i18n

端口(dev):9500

安装与开发

bash
cd dax-pay-h5
pnpm install

# 开发(端口 9500,支持 ?device=pc|mobile 强制切换设备视图)
pnpm run dev

构建

bash
cd dax-pay-h5
pnpm run build

产物路径:dax-pay-h5/dist/vant-mobile/(注意产物目录为 vant-mobile,非默认 dist/)

PC 与移动端

H5 端单一产物同时包含 PC 与移动页面,由运行时设备探测分发,无需分别构建。开发期可用 ?device=pc|mobile 查询参数强制指定。


跨端应用

三个 uni-app 客户端共用 unibest 4、Vue 3.4、pnpm 与 uni CLI 工作流,但支持的平台不同。管理端和商户端支持 H5、微信 / 支付宝 / 抖音小程序及 Android / iOS App,收银台仅支持三类小程序。

完整的平台矩阵、运行命令、构建命令、产物路径与开发工具说明见跨端应用


静态部署

uni-app 产物

本节静态部署仅适用于 Web 管理端、商户端与独立 H5。uni-app 小程序产物需导入对应平台开发者工具,App 产物需导入 HBuilderX,不直接部署到 Nginx。

前端应用构建后产物为静态文件,部署至 Nginx 或其他静态服务器即可。以下以 Web 管理端 + H5 端 + API 反向代理为例:

nginx
# Web 管理端(运营端)
server {
    listen 80;
    server_name admin.daxpay.example.com;
    root /var/www/daxpay-admin;     # 运营端 dist 产物

    location / {
        try_files $uri $uri/ /index.html;   # SPA history 路由
    }

    # API 反向代理到主应用(前端生产前缀统一为 /api;proxy_pass 结尾斜杠会剥掉 /api 前缀,后端无需感知)
    location /api/ {
        proxy_pass http://127.0.0.1:9999/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# H5 端
server {
    listen 80;
    server_name h5.daxpay.example.com;
    root /var/www/daxpay-h5/vant-mobile;    # 注意 H5 产物在 vant-mobile 子目录

    location / {
        try_files $uri $uri/ /index.html;
    }

    # API 反向代理到主应用(前端生产前缀统一为 /api;proxy_pass 结尾斜杠会剥掉 /api 前缀,后端无需感知)
    location /api/ {
        proxy_pass http://127.0.0.1:9999/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 微信域名校验文件反代到主应用(见下方说明;正则 location 优先于普通前缀,不会被 try_files 兜底吞掉)
    location ~ ^/MP_verify_[a-zA-Z0-9]+\.txt$ {
        proxy_pass http://127.0.0.1:9999;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

商户端

商户端 apps/daxpay-merchant/dist/ 部署方式与运营端一致,单独配置一个 server 即可。

微信域名校验文件必须由 Nginx 反代到主应用

收银台(H5)域名在微信公众平台配置「网页授权域名 / JS 接口安全域名」时,微信服务器会直接抓取域名根路径的 /MP_verify_*.txt 纯文本做归属比对,不执行页面脚本。H5 是纯静态 SPA,try_files 兜底返回的 index.html 对微信校验无效,所以该路径必须在进入 SPA 兜底之前由 Nginx 反代到主应用,由主应用网关查库统一响应。文件内容在管理端「支付配置 → 微信域名验证」中上传维护,上传后即时生效、无需改 Nginx。域名须先公网可达才能完成微信侧校验,DNS 切换时序见本地联调

构建验证

各应用启动成功后的验证方式汇总:

应用验证方式
主应用 dax-pay-open控制台输出 应用 'dax-pay-open' 运行成功! · http://127.0.0.1:9999/actuator/health
channel-onehttp://127.0.0.1:20100/actuator/health
channel-twohttp://127.0.0.1:20200/actuator/health
channel-one-gohttp://127.0.0.1:20100/actuator/health
Web 运营端(dev)http://127.0.0.1:6999
Web 商户端(dev)http://127.0.0.1:7999
独立 H5 端(dev)http://127.0.0.1:9500
uni-app 管理端(H5 dev)http://127.0.0.1:9000
uni-app 商户端(H5 dev)http://127.0.0.1:9100

相关章节

  • 项目运行:按场景选择运行方式的总入口
  • 跨端应用:uni-app 三端运行、构建与发布
  • 配置说明:Profile 切换、数据库、Redis、密钥与生产环境变量(按应用分单元)
  • 本地联调:内网穿透、回调域名与手机调试 H5 的联调方案

官方网站 · 基于 GNU LGPL v3.0 协议开源