

做多了后台项目之后,其实会有一种很明显的感觉:很多东西在反复做。
一开始接需求的时候,通常节奏都比较赶,很少有时间去慢慢设计架构。登录、权限、菜单这些东西,基本都是一边写一边补,能跑就行。
短期看其实没什么问题,甚至很多项目也确实是这么交付的。
但只要你自己维护过一段时间,就会发现问题慢慢开始出现了。
逻辑开始变得有点绕,权限判断到处都是,改一个接口要翻好几层代码。有时候你自己都不太敢动,怕一改就牵出一堆问题。
你心里其实很清楚,这东西迟早会变成一坨屎山,只是时间早晚的问题。
而且更烦的是,这个过程不是一次性的。
下一个项目来,还是一样的流程:
- 再写一遍登录
- 再搭一遍权限
- 再把项目结构铺一遍
- 再把日志、校验、文档这些基础东西接起来
这些东西说难也不难,但就是很消耗人,而且完全没有新鲜感。
后来我有点不想这么搞了#
做了几次之后,其实就一个想法:
能不能别每次都从 0 开始?
不是说这些东西不会写,而是没必要每次都再来一遍。
我更希望的是:
- 登录、权限这些基础能力是现成的
- 项目结构是已经整理好的
- 可以直接开始写业务,而不是先搭一堆“地基代码”
所以后来我干脆把自己项目里反复出现的那一套东西整理了一下,做成了一个可以复用的脚手架。
现在这个项目就是这么来的,叫 OneAdmin。
它大概能帮你省点什么#
这东西本质上不是拿来“学习”的,更像是一个已经帮你把基础铺好的起点。
我当时做的时候,其实就盯着一个目标:把那些每次都要做一遍的东西,尽量提前做掉。
部署这件事,能简单一点就简单一点#
以前做前后端分离,部署总是有点零碎:
后端一套、前端一套,还要搞 Nginx,有时候光环境就能折腾一阵。
所以我这边就走了一个比较简单粗暴的方案:
直接把前端打进 Go 里。
构建的时候把 Vue 的产物 embed 进去,最后就是一个可执行文件:
- 跑 API
- 顺便把后台页面也一起服务出来
基本就是:
./oneadminbash就能用了。
不一定适合所有场景,但在很多小项目里,这种方式确实省事。
权限这块,我不想再重写一遍#
权限这种东西,说实话写多了会有点烦。
每个项目都要有,而且逻辑都差不多,但又没法省。
所以我干脆一开始就把它做完整一点:
- 管理员、角色、菜单这些基础结构都有
- 中间关系也已经搭好
另外我自己项目里经常会用到比较细的控制,所以这里不只是菜单级:
按钮级权限也是直接支持的。
简单说就是:
- 菜单控制你能不能进页面
- 按钮控制你能不能点某个操作
这种东西如果后面再补,通常会比较痛苦,所以我一开始就把它放进来了。
那些“每次都要接”的东西#
还有一类东西,其实你每个项目都会用:
- 登录(Refresh Token 模式)
- Redis(顺便做了单点登录控制)
- i18n
- Swagger
- 参数校验
这些我都直接整理成了“能用的状态”,不是那种只给你个 demo 让你自己改的。
一些我自己的取舍#
这个项目没有刻意去追求什么“很高级的设计”,更多是我自己用下来觉得比较舒服的一些方式。
分层这件事,我其实是纠结过的#
老实说,我一开始并不太想把结构拆得这么细。
Go 这门语言本身就挺“克制”的,它不太鼓励你搞一堆复杂抽象。很多时候你一个文件写完,其实是最快的。
但问题是,这种写法对人是有要求的。
如果控制不好,很容易就变成:
- 什么逻辑都混在一起
- 想改点东西,要到处找
- 越写越不敢动
所以后来我还是选了一个稍微“重一点”的方式:
Handler → Service → Repository
看起来是有点“Java 味”,但好处也很现实:
- 职责清楚
- 不容易乱
- 后面改起来心里有底
说白了也不是什么设计哲学,就是:
用一点结构,换一点可控性。
bootstrap 这块,我更倾向于“看得见”#
依赖注入这件事,我没有用框架。
就是很直接地在 bootstrap 里一层一层组起来:
- 数据库
- Redis
- 各种 Service / Repository / Handler
- 路由
原因很简单,我不太喜欢“找不到依赖是从哪来的”。
写代码的时候,能看见的东西,会更安心一点。
DTO 为什么要拆#
这个地方其实是我自己踩过坑之后才这么做的。
首先,input 不只是个结构体,它还承担了校验的职责。
像必填、格式这些,其实都应该在这里处理掉。
另外一点是,我不太喜欢 struct 一路传到底。
在这个项目里:
- Handler 用一套结构
- Service 用一套
- Repository 用一套
中间做转换。
这样虽然会多写一点代码,但换来的好处是:
每一层只关心自己该关心的东西,不会互相污染。
如果你刚好也在做这些东西#
如果你最近刚好要做后台,或者已经在做类似的东西了,可以看看这个项目:
- GitHub:https://github.com/zxc7563598/oneadmin ↗
- 文档:https://hejunjie.life/oneadmin ↗
- 在线展示:https://oneadmin.hejunjie.life/admin ↗
基本上拉下来,改个配置就能跑。
最后#
这个项目其实没什么宏大的目标,就是我自己在项目里慢慢整理出来的一套东西。
能帮我少做一点重复工作,就已经很值了。
如果你刚好也有类似的需求,用得上就用;用不上,当个参考也行。
觉得还可以的话,点个 Star 就够了。