2026-07-31 14:16:29 +08:00
2026-07-31 12:57:17 +08:00
2026-07-31 12:57:17 +08:00
2026-07-31 14:16:29 +08:00
2026-07-22 13:15:29 +08:00
2026-07-31 12:57:17 +08:00
2026-07-31 12:57:17 +08:00
2026-07-31 12:57:17 +08:00
2026-07-31 12:57:17 +08:00
2026-07-22 13:15:29 +08:00
2026-07-30 23:44:50 +08:00
2026-07-31 12:57:17 +08:00

游戏皮肤分销管理系统

基于 Go + React 的游戏皮肤分销管理平台,支持分销商管理、订单追踪、上游皮肤源头对接。

技术栈

层级 技术
后端 Go 1.26 + Gin + GORM
数据库 PostgreSQL 16
前端 React 19 + TypeScript + Ant Design
构建 Vite + Docker Compose
反向代理 Caddy

本地开发

环境要求

  • Go 1.26+
  • Node.js 22+
  • Docker(用于自动启动 PostgreSQL 开发容器)

快速启动

# 1. 复制配置文件
cp .env.example .env
# 按需修改 .env 中的密钥

# 2. 一键启动(后端 + 前端 + PostgreSQL
make dev
# 或直接
./start.sh

启动后:

  • 前端:http://localhost:5173
  • 后端:http://localhost:8080
  • 默认管理员:admin / admin123

Ctrl+C 停止所有服务。

手动启动

# 安装依赖
make install

# 分别启动
make backend   # 后端 :8080
make frontend  # 前端 :5173

Docker 生产部署

配置

cp .env.example .env
# 编辑 .env,确保以下变量已配置:
#   JWT_SECRET        — 生产环境务必修改
#   OPEN_API_KEY      — 皮肤源头对接 API Key
#   OPEN_API_SECRET   — 签名密钥
#   DATABASE_URL      — PostgreSQL 连接,容器内主机名为 postgres

国内服务器可在 .env 中取消 GOPROXYALPINE_MIRRORNPM_REGISTRY 等镜像加速源的注释。

启动服务

# 构建并启动全部服务(PostgreSQL + 后端 + Caddy
make docker-up
# 或
docker compose up -d --build

服务端口:

  • :80 — 前端页面 + API(Caddy 统一入口)
  • :8080 — 后端 API(直接访问,调试用)

常用命令

make docker-logs    # 查看日志
make docker-ps      # 查看容器状态
make docker-down    # 停止并移除

自定义域名

修改 Caddyfile 中的域名 skin.khhao.com 为你的域名,重新构建即可。

环境变量

变量 说明 默认值
PORT 后端端口 8080
JWT_SECRET JWT 签名密钥 开发默认值
DATABASE_URL PostgreSQL 连接串 本地开发默认值
GIN_MODE Gin 运行模式 debug
OPEN_API_KEY 开放接口 ApiKey 需修改
OPEN_API_SECRET 开放接口签名密钥 需修改
OPEN_SIGN_SKEW 签名时间戳偏差(秒) 300
OPEN_API_DEBUG 开放接口调试日志 debug 模式默认开启
LOG_FILE 日志文件路径 logs/app.log

开放接口(皮肤源头对接)

项目有两套外部 API,请先区分调用方:

  • 商户侧 /api/client/v1:商户系统创建订单、查询订单和钱包,使用商户专属 X-App-Key
  • 源头侧 /api/open/v1:上游发货平台查询订单并回传发货结果,使用平台配置的 X-Api-Key

源头侧 ship_notify 当前只使用 success / failed,速查见 docs/发货通知约定.md,完整关系图见 docs/API对接关系.md。两套 API 的签名算法不同,不能混用鉴权头或签名串。

上游皮肤源头系统调用源头侧接口时,需携带签名头 X-Api-KeyX-TimestampX-NonceX-Sign

1. 查询订单(发货前置)

GET /api/open/v1/orders/:order_no

返回订单状态、商品信息、是否可发货。

2. 发货结果通知

POST /api/open/v1/orders/ship-notify

上游发货完成后推送结果,请求体:

{
  "order_no": "O202607241200000012",
  "ship_status": "success",
  "provider_order_no": "上游单号",
  "shipped_at": "2026-07-24T16:00:00+08:00",
  "fail_reason": "",
  "game_channel": "IOS-微信",
  "game_uid": "550e8400-e29b-41d4-a716-446655440000",
  "role_name": "玩家名",
  "pay_score": 100
}
字段 必填 说明
order_no 系统订单号
ship_status success / failed
provider_order_no 上游单号
shipped_at 发货时间,RFC3339 格式
fail_reason 失败时是 failed 时必填,填写详细失败原因
game_channel 账号区服(安卓/IOS-微信/QQ
game_uid 游戏角色 UUID
role_name 角色名
pay_score 消耗积分

管理端

管理员登录后可访问商品管理、订单管理、用户管理、发货日志等功能。后台默认地址 /

目录结构

├── backend/
│   ├── cmd/server/main.go     # 入口
│   └── internal/
│       ├── config/            # 配置加载
│       ├── handler/           # HTTP 处理器
│       ├── middleware/        # JWT 认证、签名验证
│       ├── model/             # 数据模型
│       ├── pkg/               # 工具包
│       ├── router/            # 路由
│       └── service/           # 业务逻辑
├── frontend/src/
│   ├── api/                   # API 调用
│   ├── pages/                 # 页面组件
│   ├── layouts/               # 布局
│   └── types/                 # 类型定义
├── docker-compose.yml         # 容器编排
├── Makefile                   # 常用命令
└── start.sh                   # 开发一键启动
S
Description
No description provided
Readme
659 KiB
Languages
Go 57.9%
TypeScript 38.4%
CSS 2.7%
Shell 0.8%
Makefile 0.2%