Skip to content

About

基于 Go、Gin、Vue 3 与 Vue Vben Admin 的企业级后台管理基础平台。

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

Gin-Vben-Admin

基于 Go、Gin、Vue 3 与 Vue Vben Admin 的企业级后台管理基础平台。

当前版本:1.0.0-dev

项目链接

基本介绍

项目提供管理端 UI 模板、Gin HTTP 服务、OpenAPI 契约、开发脚本和 Docker Compose 配置,适合企业后台、SaaS 管理台、ERP、CRM、CMS、OA 等项目的基础建设。

主要功能

  • 管理端布局、路由、主题和国际化基础能力
  • 管理端接口契约与统一响应模型
  • 管理端登录、refresh 轮换、登出、账号/IP 限流和失败锁定(启用认证配置后)
  • tenant_id 必填的租户/组织隔离与默认拒绝策略
  • Gin 健康检查、统一响应和 request ID
  • OpenAPI、错误码和响应 schema
  • MySQL/PostgreSQL 的单机、读写分离与集群端点配置;Redis single/Sentinel/Cluster 配置
  • 显式数据库迁移、本地加密备份与恢复校验
  • Prometheus 指标和 OTLP tracing 导出(默认关闭,可在管理端配置)
  • Windows、macOS、Linux 通用的 Node.js 开发命令
  • 源码运行与 Docker Compose 部署
  • 五组生产菜单、仪表盘运营概览与数据库/Redis 资源监控

公共能力开发入口(B1.7d 实现中)

首个实现切片已落地:Go 公共端口、内存运行时、管理 API、模型/迁移草案、OpenAPI 路径以及三套 管理端的 SMTP/媒体库引导已接入当前 main 工作区。生产 outbox/relay、持久化运行时和真实 provider 切换仍按开发文档的收口清单推进;对接方可先按公开 API 文档接线。

  • SMTP 与通知(公共入口): 业务模块通过 MailSender、NotificationService 和 VerificationCodeService 注入调用;账号池、模板、验证码策略和发送审计由管理端统一维护。
  • 媒体库(公共入口): 业务模块通过 MediaCatalog 查询 MIME 类型族、分类和子分类,保存资源 ID, 并通过 MediaUsageService 维护 Logo 等业务引用。
  • 管理端引导: SMTP 与媒体库页面提供普通使用、开发者对接和调用示例三类侧边抽屉流程,三套 UI 共享步骤 schema 与错误 key;邮件服务页面按 SMTP 账户、调用者、通知模板、验证码策略、投递记录五个 Tag 组织操作。
  • 详细接口、数据模型、状态机、迁移顺序、测试和回滚见 docs/development/common-capabilities.md。
  • 需要直接接线时,优先查阅 docs/integration/common-capabilities-api.md;该页按文件、方法、参数、返回值和 Demo 编排。

技术选型

层级 技术
管理端 Vue 3、TypeScript、Vue Vben Admin
UI 模板 Ant Design Vue、Element Plus、Naive UI
服务端 Go 1.24、Gin
API 契约 OpenAPI
数据服务 MySQL 9.7、PostgreSQL 18.4、Redis 8.10
工程化 pnpm、Turborepo、Node.js、GitHub Actions
部署 Docker、Docker Compose

目录树

.
├── admin/                              # 管理端 pnpm workspace
│   ├── apps/web-antd/
│   ├── apps/web-ele/
│   ├── apps/web-naive/
│   ├── apps/install/                  # 首次安装静态页面
│   ├── packages/
│   ├── internal/
│   ├── scripts/
│   ├── tests/
│   ├── package.json
│   ├── pnpm-workspace.yaml
│   └── pnpm-lock.yaml
├── server/                             # Gin HTTP 服务
│   ├── cmd/api/
│   ├── cmd/migrate/
│   ├── configs/server.example.yaml
│   ├── internal/bootstrap/
│   ├── internal/config/
│   ├── internal/transport/http/
│   ├── go.mod
│   └── go.sum
├── contracts/                          # OpenAPI、错误码、响应 schema
├── deploy/                             # 单机 Compose 与两份 Alpine Dockerfile
│   ├── docker-compose.yml
│   ├── admin.Dockerfile
│   └── server.Dockerfile
├── scripts/                            # 跨平台 Node.js 脚本
├── tests/contract/                     # 根级契约测试
├── docs/                               # 公开文档
├── LICENSES/                           # 第三方许可证
├── .github/
├── .env.example
├── LICENSE
├── NOTICE
├── README.md
└── .gitignore

快速开始

环境要求

  • Git
  • Go >= 1.24
  • Node.js ^22.18.0 || ^24.12.0
  • pnpm 11.16.0
  • Docker Engine + Compose v2(使用 Docker 部署时)

Windows 推荐 PowerShell 7,macOS 推荐 zsh,Linux 使用 bash。启用 pnpm:

corepack enable
corepack prepare pnpm@11.16.0 --activate

没有 Corepack 时:

npm install --global pnpm@11.16.0

获取源码

git clone REPOSITORY_URL Gin-Vben-Admin
cd Gin-Vben-Admin

初始化与源码运行

本节采用单仓库非破坏选择:三套模板同时保留,选择只影响本机运行分发。

仓库始终保留 admin/apps/web-antd、admin/apps/web-ele、admin/apps/web-naive 三套 UI 源码。选择器只维护被 Git 忽略的本机 profile、依赖收据和运行配置,不会删除、移动或 重命名任何模板。网页提供 Ant Design Vue、Element Plus、Naive UI 三个选项。

1. 拉取、检查环境

corepack enable
corepack prepare pnpm@11.16.0 --activate

先按上面的“获取源码”进入仓库。下面的浏览器优先和 CLI 优先流程 二选一,不要混用。 网页/CLI 初始化完成后,统一在 admin/ 执行一次 pnpm install,确保 workspace 依赖和本地链接完整。

2A. 浏览器优先(普通用户推荐)

首次安装只启动 Go 服务端,暂不启动管理端开发服务器:

cd server
go run ./cmd/api/

打开 http://127.0.0.1:8080/install,选择 Ant Design Vue、 Element Plus 或 Naive UI。网页准备任务会写入本机选择,并完成 profile、workspace 与所选 UI 的依赖准备; 另外两套源码保持原样。

在网页中完成数据库、Redis、管理员和默认项配置并看到安装成功后,进入下面“两条路径共同的完成步骤”。

2B. CLI 优先(开发者)

若选择本路径,请跳过 2A。先预览并写入本机选择:

cd admin
pnpm run ui:select -- --check
pnpm run ui:select -- ele --dry-run
pnpm run ui:select -- ele

可选值为 antd、ele、naive。选择记录在 admin/.ui-profile.local.json(已加入 .gitignore)。随后启动 Go 服务端并打开安装页:

cd ../server
go run ./cmd/api/
# 浏览器打开 http://127.0.0.1:8080/install

此时网页把 CLI 已选 UI 显示为只读项,只继续数据库、Redis、管理员和默认项安装。看到安装成功后, 进入下面的共同完成步骤;不要在网页安装完成前另开一个 pnpm run dev。

两条路径共同的完成步骤

停止安装时启动的服务端,再打开两个终端。管理端只在此处启动一次:

# 终端 1:服务端
cd server
go run ./cmd/api/

# 终端 2:管理端
cd admin
pnpm install
pnpm run dev

pnpm install 使用 admin/pnpm-lock.yaml 安装 workspace 依赖并刷新本地链接;重复执行是幂等的。 如果只切换 UI 或在 CI 中按 profile 安装,可继续使用 pnpm run ui:install 的过滤安装入口。

若首次登录持续提示凭据无效,先停止正在运行的 Go 服务端,再在仓库的 server 目录重设 安装收据中记录的初始管理员密码;成功后重新启动服务端。 命令不会通过参数或输出暴露密码,也不会接收任意用户名;两次输入必须一致,并遵循安装页相同的 6–72 位 ASCII 字母加数字规则。输入时终端不回显:

read -rs NEW_ADMIN_PASSWORD
printf '\n'
read -rs NEW_ADMIN_PASSWORD_CONFIRM
printf '\n'
printf '%s\n%s\n' "$NEW_ADMIN_PASSWORD" "$NEW_ADMIN_PASSWORD_CONFIRM" | go run ./cmd/admin-password reset
unset NEW_ADMIN_PASSWORD NEW_ADMIN_PASSWORD_CONFIRM

成功输出 ADMIN_PASSWORD_RESET=OK 和 LOGIN_FAILURE_STATE_RESET=OK;该操作同时清除数据库和 Redis 中该账号的登录失败/锁定状态。使用非默认 YAML 时追加 --config PATH。

团队成员可以各自选择。Node/CLI 还接受 ADMIN_UI,并兼容 APP_UI 别名;CI/Docker 仅使用 显式 ADMIN_UI=antd|ele|naive,不把个人偏好提交到分支。

3. 运行与安装状态

dev、build、preview 只分发当前选择的包;公共业务包和三套 UI adapter 仍由同一 workspace 管理。执行 pnpm install 并完成网页安装后,前端命令即可分发到所选包; .runtime/install/.installed 只证明后端数据库/管理员安装完成,并控制业务 API 门禁,不是 前端依赖或构建门禁。教程仍把 pnpm run dev 放在网页安装之后,以免开发页面请求尚未开放的 业务 API。

维护检查可在任意终端执行:

cd admin
pnpm run init -- --check

4. 后续拉取上游更新

git status
git pull --ff-only
cd admin
pnpm install
pnpm run dev

选择器不会删除 tracked UI 路径,因此不会因为“本机选了其中一套”制造 modify/delete 冲突。 用户自己修改了上游同一文件、提交历史已经分叉或存在未提交改动时,仍按普通 Git 工作流先提交、 暂存、rebase 或 merge;git pull --ff-only 只适用于当前分支能够快进的情况。lockfile 或公共包 变化后重新执行 pnpm install;若需要节省安装范围,可使用 pnpm run ui:install 刷新当前 UI 的依赖收据。

从旧版“删除两套 UI”工作区一次性收敛

旧版本已经执行过 source-moving 初始化的用户,先停止 init/dev。若 pnpm run init -- --check 显示仍有未完成事务,先按输出续跑或在网页后端安装完成前执行 pnpm run init -- --reset --confirm-reset;不要绕过活动 journal。事务已完成后,把未选择的两套 tracked 目录恢复到当前提交,再写入同一个本机选择。以下示例假设旧选择为 ele,因此只恢复另外两套:

# 仓库根目录;不会覆盖已选择的 web-ele 本地适配
git restore --source=HEAD -- admin/apps/web-antd admin/apps/web-naive
cd admin
pnpm run ui:select -- ele
pnpm install
cd ..
git status --short
git pull --ff-only

若旧选择是 antd 或 naive,对应替换命令中的两条未选目录。未选目录里若也有需要保留的本地 改动,先单独备份或提交;恢复后 Git 不再看到这两棵树的本机删除,后续更新就进入上面的普通 fast-forward 流程。旧 .ui-profile.json/receipt 只保留作兼容证据,本机 .ui-profile.local.json 从此优先,日常不再运行 source-moving 初始化。

5. 切换 UI

切换不会恢复、删除或重新安装后端,也不会改写数据库:

cd admin
pnpm run ui:select -- naive --check   # 查看计划
pnpm run ui:select -- naive           # 写入新选择
pnpm install                            # 安装并刷新当前 workspace 依赖
pnpm run dev

切换报告写入 .runtime/install/ui-switch-report.json,包含 previousUi、selectedUi、changedBranch=selectedUi、commonLayer=preserved 和 sourceAdapter、targetAdapter、uiSpecific=revalidate-adapter,以及 adapterChecks=[route,theme,form,component]。这些字段表示需要人工复核新 UI adapter;报告不会 伪造自动迁移结果。选择器原子更新活动 profile;根 .env 保持字节不变,不再维护重复的 UI 环境变量。

已完成网页安装的工作区会保留原 .runtime/install/.installed,并在 .runtime/install/ui-switch-history/ 保存字节一致的历史副本作为审计证据。服务端继续报告 installed,现有数据库、管理员和业务 API 保持可用;切换后运行 pnpm install,无需再次执行 网页后端安装。

6. CI / Docker

ADMIN_UI=antd pnpm --dir admin install --filter @vben/web-antd... --frozen-lockfile
ADMIN_UI=antd pnpm --dir admin run build
ADMIN_UI=naive docker compose -f deploy/docker-compose.yml up -d --build

CI 建议用矩阵分别验证三套 UI;每次使用同一份 admin/pnpm-lock.yaml,不生成分叉 lockfile。 没有 ADMIN_UI 且没有本机选择时,构建门禁会提示先选择目标。

登录后默认进入 /dashboard 仪表盘。生产菜单、兼容路由、访问码与各页面职责见 docs/admin-information-architecture.md。

编辑本地 server/configs/server.yaml 或设置环境变量后,使用显式命令管理数据库建表迁移。全新安装由 server/migrations/schema.go 注册 server/internal/platform/persistence/model 中的 Model, 通过 GORM Migrator().CreateTable 一次完成;后续版本按模块使用显式 GORM Migrator 升级。详细约定见 docs/database-migration.md。

go -C server run ./cmd/migrate status
go -C server run ./cmd/migrate up
go -C server run ./cmd/migrate down --steps 1

建表只使用配置指定的 MySQL/PostgreSQL 主库,不执行增量 ALTER/ADD 操作;业务关系不创建数据库外键约束或外键索引。 后台、共享身份和预留用户端的 Model 边界,以及后续升级目录见迁移文档。

配置支持 MySQL/PostgreSQL 的 single、read_write、cluster_endpoint 模式,以及 Redis 的 single、sentinel、cluster 模式。默认示例关闭外部依赖;启用时请通过本地配置或环境变量填写连接信息。

启用管理端认证时,在本地配置中填写至少 32 字节的 auth.jwt_secret(或设置 AUTH_JWT_SECRET),并同时启用数据库与 Redis。登录、刷新和登出接口见 contracts/openapi/admin-v1.yaml;refresh token 只保存在 HttpOnly Cookie。

配置文件

配置按“示例可提交、运行时本地化”管理:

  • server/configs/server.example.yaml:精简的部署输入模板,默认 PostgreSQL;未列出的超时、连接池、语言和业务策略使用 typed config 默认值,不再复制过时默认值。
  • server/configs/server.yaml:本机服务端配置(Git ignored),从示例复制或由初始化脚本生成;运行服务端时从 server/ 目录读取。
  • .env.example:可选的根目录部署环境模板;全新安装无需复制。手工创建 .env 时设置 0600 权限。环境变量优先于 YAML,安装页只写入实际连接和认证必需参数。
  • admin/apps/web-*/.env.*.example:各管理端的公开 Vite 默认值;初始化会为当前 UI 生成被忽略的本地文件,不要在其中写入服务端密钥。

常用本地准备命令:

cp server/configs/server.example.yaml server/configs/server.yaml
cp .env.example .env
chmod 600 .env server/configs/server.yaml

全新安装直接打开 /install,选择管理界面并勾选确认后,点击“准备界面并预检”,自动完成依赖准备与目录检查;不再选择运行方式或语言。数据库默认 PostgreSQL,然后填写数据库、Redis 和管理员信息。页面会安全更新根 .env,无需手工拼接 DSN 或密码。

pnpm run dev、build、preview 各只执行一次选择检查与分发;成功时不打印 INIT_* 状态块,异常仍返回诊断与非零退出码。需要安装状态详情时使用 pnpm run init -- --check。登录态默认沿用当前策略 24h,安装器不再写入历史 30m 覆盖。验证码、邮件、语言和观测等业务默认值不再复制到示例文件中;现有显式部署配置仍受支持。

初始化状态文件

以下文件或目录由网页准备任务、Node 初始化器和服务端共同维护,不要手动删除、改名或编辑。个人选择文件不进入 Git;中断后重新运行选择命令或重新打开 /install:

维护检查仍可使用 pnpm run init -- --check;网页安装前的旧版恢复入口为 pnpm run init -- --reset --confirm-reset。新项目的日常选择使用上面的 ui:select,不执行 源码移动清理。

路径 作用
admin/.ui-profile.local.json 本机 UI 选择(已忽略);优先级高于旧版 tracked profile
admin/.ui-profile.json 旧版兼容读取入口;新选择流程不会改写它
.runtime/install/ 初始化事务根目录;租约、依赖收据、切换报告等由程序维护,请勿删除或编辑
.runtime/install/workspace-transaction.json 非破坏 journal;switching_ui 保护 selector 与派生元数据的原子切换,dependencies_pending 保护依赖准备,moves 始终为空。中断后用同一目标重跑;journal 存在时 dev/build 门禁保持关闭
.runtime/install/workspace-dependencies.json 当前 UI 与 lockfile 摘要;过滤安装入口成功后刷新
.runtime/install/ui-switch-report.json 切换前后 UI、公共层保留与 adapter 复核提示
.runtime/install/ui-switch-history/ 已安装工作区切换时保存的后端安装标记只读历史副本;原标记保持不变
.runtime/install/.installed 网页后端安装完成标记和业务 API 门禁;不作为前端依赖/build 门禁,切换 UI 时保留
.runtime/install/admin-init.lock 网页 UI 准备子进程的 schema 2 租约;绑定 PID 与进程启动身份,真实 owner 即使心跳长时间暂停也不会被 TTL 误回收,崩溃或 PID 复用后由程序安全回收
.runtime/install/admin-init.lock.reclaim 回收崩溃进程租约时使用的原子墓碑;可能短暂存在或在回收进程中断后保留,重跑 init 会自动恢复
.runtime/install/admin-init-heartbeat/ 按租约 UUID 隔离并绑定进程启动身份的一主一 owner 双 init 心跳;同步安装依赖期间持续更新,单通道异常或系统暂停不会误解锁
.runtime/install/apply.lock 服务端网页安装/回滚全程持有的进程租约;与 admin-init.lock 双向互斥,服务端重启时会在同一 guard 下安全回收崩溃残留,请勿手动删除
.runtime/install/dependency-install.lock 后台依赖安装监督进程的持久租约;绑定监督进程与实际 pnpm Worker 生命周期,前台 init 中断后也用于阻止第二次安装重叠
.runtime/install/dependency-install.lock.reclaim 依赖安装租约的原子回收墓碑;仅由 init 在监督进程及其后代均结束后恢复或清理
.runtime/install/dependency-install-heartbeat/ 后台依赖安装监督进程按 UUID 写入的心跳;长时间安装时保持租约活跃
.runtime/install/dependency-install.log pnpm install 及 lifecycle 命令的本地诊断日志;init 会输出该路径,安装失败时可查看但不要删除或编辑
.runtime/install/dependency-job-gate-<UUID>.json Windows 下确认依赖监督进程已进入 kill-on-close Job Object 的短期门闩;正常结束时自动清理,强制终止或断电留下的 UUID 隔离残片不阻塞后续 init,请勿手动删除
.runtime/install/process.guard 服务端安装锁共用的持久跨进程保护文件;即使当前没有安装任务也不要删除
.runtime/install/.installed.lock 防止并发安装或并发改写完成标记的短期互斥锁
.runtime/install/transaction.json 旧版 UI 移动事务和网页安装阶段的兼容记录
.runtime/install/ui-backup/ 仅旧版迁移/恢复可能出现;新选择流程不会创建
.runtime/install/legacy-prepared-migration.json 接管旧版 Windows 构建失败状态的持久迁移 journal;--check 只读识别,重跑 init 从已完成的 rename 继续
.runtime/install/legacy-recovery/<transaction>/.ui-init-receipt.json 迁移时可逆隔离的旧 receipt;用于证明来源,不参与当前事务,请勿移动或改写
.runtime/init-backup/ 旧版 init 的 UI 暂存目录;严格合法的目标事务由新版原子迁走,冲突现场保持原样
.runtime/init-recovery/ 旧版 init 的历史恢复记录;新版迁移会保留其内容,不要手动清理

删除这些状态会使 profile、源码布局和安装结果失去一致性;程序检测到不一致时会保护现场并给出稳定状态码。 若安装需要替换已有 .env,environment-backup/ 会短暂保存权限为 0600 的原文件用于补偿;完成标记提交后程序会按事务精确删除,勿复制或提交该目录。

源码部署

管理端构建(先完成上面的 UI 选择,并安装当前目标依赖):

cd admin
pnpm install
pnpm run build

构建结果位于当前选择的 admin/apps/web-<ui>/dist/,可交给 Nginx 或其他静态文件服务。服务端构建:

go -C server build -o ./bin/server-api ./cmd/api
./server/bin/server-api

运行时配置使用 server/configs/server.example.yaml 复制出的本地配置或环境变量;实际密钥和连接串不提交到 Git。

Docker 部署

源码首次安装

全新 clone 请先使用“2A. 浏览器优先”通过 Go /install 完成 UI、数据库、Redis 和管理员安装。 当前 Compose 样例不代理 /install、服务端镜像不携带 embedded 安装页,也没有为 .runtime/install/.installed 声明持久化挂载,因此不能把下面的 Compose 命令当作首次安装或 首次登录入口。

已安装环境与镜像/基础设施冒烟

部署平台已经安全提供持久化后端安装标记、运行配置和数据库后,可显式选择一个 UI 构建镜像。 仓库自带 Compose 默认只验证服务端、管理端、单机 MySQL 和单机 Redis 的构建与基础设施拓扑:

ADMIN_UI=antd docker compose -f deploy/docker-compose.yml up -d --build
docker compose -f deploy/docker-compose.yml ps
docker compose -f deploy/docker-compose.yml run --rm migrate status

CI/Docker 通过 ADMIN_UI=antd|ele|naive 显式选择构建模板; admin/.ui-profile.local.json 已同时加入 .gitignore 与 .dockerignore,个人选择不会进入镜像上下文。 旧版 tracked .ui-profile.json 仅作兼容回退;若它与显式部署选择冲突,构建以 UI_PROFILE_MISMATCH 停止,不会静默构建另一套 UI。

deploy/ 只保留这一份 Compose 入口和两份 Alpine Dockerfile;迁移服务会在 API 前启动, 服务端使用本地配置或环境变量中的 database.driver 与 DSN。若没有部署平台提供的持久安装状态, 业务 API 会按设计返回 423;完整限制和验收步骤见手工验收文档的 Docker 阶段。

开发/验收拓扑(双库、读写分离、Redis Sentinel/Cluster、Prometheus/Grafana 和 Mailpit)按需生成到 .runtime/compose/,不进入正式部署目录:

node scripts/prepare-runtime-compose.mjs
docker compose -f .runtime/compose/dev.yaml config --quiet
docker compose -f .runtime/compose/postgres.yaml config --quiet
docker compose -f .runtime/compose/read-write.yaml config --quiet
docker compose -f .runtime/compose/ha.yaml config --quiet
docker compose -f .runtime/compose/observability.yaml config --quiet

停止服务:

docker compose -f deploy/docker-compose.yml down

默认管理端端口为 5173,服务端端口为 8080;可通过 Compose 环境变量调整。

使用说明

  • 管理端 API 地址默认使用 /api,开发代理指向本地 Gin 服务。
  • 管理端连通性检查:GET /api/admin/v1/ping。
  • 健康检查:GET /health/live、GET /health/ready。
  • 管理端接口契约位于 contracts/openapi/。
  • 本地配置、日志、数据库卷和构建产物按 .gitignore 规则处理。

候选版本运行手册见 docs/release/0.9.0-rc-runbook.md。贡献、安全、变更和第三方归属文件分别见 CONTRIBUTING.md、SECURITY.md、CHANGELOG.md 和 THIRD_PARTY_NOTICES.md。

从全新 clone、首次安装到每个产品功能与边界数据的逐项人工检查,见 docs/manual-acceptance/1.0.0-dev-end-to-end.md。

验证

node --test tests/contract/contract.test.mjs
pnpm --dir admin run test:smoke
pnpm --dir admin run check:type
go -C server test ./...
node ./scripts/verify.mjs --scope basic

可选本地观测组件:

node scripts/prepare-runtime-compose.mjs
docker compose -f .runtime/compose/observability.yaml --profile observability up -d

发布包校验:

node scripts/release/package.mjs --check

贡献指南

贡献流程文档:

  • CONTRIBUTING:
  • 安全报告:
  • 变更记录:

提交代码前请运行相关测试,并保持提交内容聚焦单一改动。

许可证

本项目采用 MIT License。前端基于 Vue Vben Admin;上游许可证文本见 LICENSES/Vue-Vben-Admin-MIT.txt,归属信息见 NOTICE。

About

基于 Go、Gin、Vue 3 与 Vue Vben Admin 的企业级后台管理基础平台。

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages