星河避难所

返回

Go + Vue 打包成一个单二进制的后台系统,我做了个后台脚手架Blur image

做多了后台项目之后,其实会有一种很明显的感觉:很多东西在反复做。

一开始接需求的时候,通常节奏都比较赶,很少有时间去慢慢设计架构。登录、权限、菜单这些东西,基本都是一边写一边补,能跑就行。

短期看其实没什么问题,甚至很多项目也确实是这么交付的。

但只要你自己维护过一段时间,就会发现问题慢慢开始出现了。

逻辑开始变得有点绕,权限判断到处都是,改一个接口要翻好几层代码。有时候你自己都不太敢动,怕一改就牵出一堆问题。

你心里其实很清楚,这东西迟早会变成一坨屎山,只是时间早晚的问题。

而且更烦的是,这个过程不是一次性的。

下一个项目来,还是一样的流程:

  • 再写一遍登录
  • 再搭一遍权限
  • 再把项目结构铺一遍
  • 再把日志、校验、文档这些基础东西接起来

这些东西说难也不难,但就是很消耗人,而且完全没有新鲜感。

后来我有点不想这么搞了#

做了几次之后,其实就一个想法:

能不能别每次都从 0 开始?

不是说这些东西不会写,而是没必要每次都再来一遍。

我更希望的是:

  • 登录、权限这些基础能力是现成的
  • 项目结构是已经整理好的
  • 可以直接开始写业务,而不是先搭一堆“地基代码”

所以后来我干脆把自己项目里反复出现的那一套东西整理了一下,做成了一个可以复用的脚手架。

现在这个项目就是这么来的,叫 ​OneAdmin

它大概能帮你省点什么#

这东西本质上不是拿来“学习”的,更像是一个已经帮你把基础铺好的起点。

我当时做的时候,其实就盯着一个目标:把那些每次都要做一遍的东西,尽量提前做掉。

部署这件事,能简单一点就简单一点#

以前做前后端分离,部署总是有点零碎:

后端一套、前端一套,还要搞 Nginx,有时候光环境就能折腾一阵。

所以我这边就走了一个比较简单粗暴的方案:

直接把前端打进 Go 里。

构建的时候把 Vue 的产物 embed 进去,最后就是一个可执行文件:

  • 跑 API
  • 顺便把后台页面也一起服务出来

基本就是:

./oneadmin
bash

就能用了。

不一定适合所有场景,但在很多小项目里,这种方式确实省事。

权限这块,我不想再重写一遍#

权限这种东西,说实话写多了会有点烦。

每个项目都要有,而且逻辑都差不多,但又没法省。

所以我干脆一开始就把它做完整一点:

  • 管理员、角色、菜单这些基础结构都有
  • 中间关系也已经搭好

另外我自己项目里经常会用到比较细的控制,所以这里不只是菜单级:

按钮级权限也是直接支持的。

简单说就是:

  • 菜单控制你能不能进页面
  • 按钮控制你能不能点某个操作

这种东西如果后面再补,通常会比较痛苦,所以我一开始就把它放进来了。

那些“每次都要接”的东西#

还有一类东西,其实你每个项目都会用:

  • 登录(Refresh Token 模式)
  • Redis(顺便做了单点登录控制)
  • i18n
  • Swagger
  • 参数校验

这些我都直接整理成了“能用的状态”,不是那种只给你个 demo 让你自己改的。

一些我自己的取舍#

这个项目没有刻意去追求什么“很高级的设计”,更多是我自己用下来觉得比较舒服的一些方式。

分层这件事,我其实是纠结过的#

老实说,我一开始并不太想把结构拆得这么细。

Go 这门语言本身就挺“克制”的,它不太鼓励你搞一堆复杂抽象。很多时候你一个文件写完,其实是最快的。

但问题是,这种写法对人是有要求的。

如果控制不好,很容易就变成:

  • 什么逻辑都混在一起
  • 想改点东西,要到处找
  • 越写越不敢动

所以后来我还是选了一个稍微“重一点”的方式:

Handler → Service → Repository

看起来是有点“Java 味”,但好处也很现实:

  • 职责清楚
  • 不容易乱
  • 后面改起来心里有底

说白了也不是什么设计哲学,就是:

用一点结构,换一点可控性。

bootstrap 这块,我更倾向于“看得见”#

依赖注入这件事,我没有用框架。

就是很直接地在 bootstrap 里一层一层组起来:

  • 数据库
  • Redis
  • 各种 Service / Repository / Handler
  • 路由

原因很简单,我不太喜欢“找不到依赖是从哪来的”。

写代码的时候,能看见的东西,会更安心一点。

DTO 为什么要拆#

这个地方其实是我自己踩过坑之后才这么做的。

首先,input 不只是个结构体,它还承担了校验的职责。

像必填、格式这些,其实都应该在这里处理掉。

另外一点是,我不太喜欢 struct 一路传到底。

在这个项目里:

  • Handler 用一套结构
  • Service 用一套
  • Repository 用一套

中间做转换。

这样虽然会多写一点代码,但换来的好处是:

每一层只关心自己该关心的东西,不会互相污染。

如果你刚好也在做这些东西#

如果你最近刚好要做后台,或者已经在做类似的东西了,可以看看这个项目:

基本上拉下来,改个配置就能跑。

最后#

这个项目其实没什么宏大的目标,就是我自己在项目里慢慢整理出来的一套东西。

能帮我少做一点重复工作,就已经很值了。

如果你刚好也有类似的需求,用得上就用;用不上,当个参考也行。

觉得还可以的话,点个 Star 就够了。

Go + Vue 打包成一个单二进制的后台系统,我做了个后台脚手架
https://hejunjie.life/blog/c9fu5hnq
作者 何俊杰
发布时间 2026年3月30日
版权信息 CC BY-NC-SA 4.0
评论似乎卡住了,尝试刷新?✨