早上刷 GitHub 趋势榜,看到一个后端相关项目,Star 数已经到 94.7k,评论区最高赞的一句话是:“用了它之后,我两周没写过增删改查接口了。” 我是做前后端分离项目出身的人,看到这种标题第一反应是“又在吹”,但点进去把文档和 Demo 都过了一遍之后,我发现“再也不写胶水代码”这句话虽然带点营销味儿,背后确实有实打实的东西。
这篇就当一次拆解:这个 94.7k Star 的全功能后端到底做了什么、3 分钟跑通是不是真的、哪些场景能直接替代你的后端代码、哪些场景千万别盲目套进去。我会结合自己实际接项目时踩过的坑来讲,尽量不替 GitHub 主页背广告词。
1. “胶水代码”为何会成为后端团队最大的隐性成本
1.1 到底什么算胶水代码
先给胶水代码画个像,不然很多人会以为我在贬低后端工作。
胶水代码不是业务逻辑,不是算法,也不是性能优化,而是那堆“不写上就跑不起来,写上了又没人会觉得你牛”的代码。拿一个很常见的场景举例:前端要展示用户列表,后端需要做什么?建一张users表,写实体类、Dao/Mapper、Service、Controller,加参数校验、异常处理、统一返回格式,再配置分页查询、字段过滤、跨域,最后生成接口文档。这些代码单独看每一行都很简单,但一张表一套,十张表十套,二十张表就是几百个文件。
我第一次独立做后端项目的时候,光搭这套增删改查模板就花了三天。当时用的还是同事已经封装好的基础框架,三天里大部分时间都在复制粘贴、改字段名、加注解,干完了自己都觉得没有成就感。
| 传统后端一张表的成本 | 说明 |
|---|---|
| 数据层 | 实体类、Mapper、XML 或注解 |
| 服务层 | 业务方法、参数转换、事务控制 |
| 控制层 | 路由、鉴权、分页包装、统一返回 |
| 配置成本 | 跨域、拦截器、序列化规则 |
| 周边成本 | 接口文档、单元测试、模拟数据 |
这些就是胶水代码。它们不是不能写,而是数量大、重复度高、出错概率还一点不低,尤其在字段类型改一个之后,几层文件要同步改,漏一处就线上出 bug。
1.2 前后端分离之后,胶水层还在变大
现在项目普遍采用前后端分离,前端和后端之间多出来一层“接口契约”。这层契约本来应该靠接口文档管理,实际操作里,前端要自己封装请求库,写 mock,处理 loading 状态、错误码、Token 刷新,后端要处理 CORS、参数校验、分页格式。同一个接口,两边各写一套逻辑,任何一边改了字段,另一边就要跟着改。
很多小团队的现状是:后端同学每天在写 CRUD,前端同学每天在请求 CRUD 的接口并渲染表格。两边都在干体力活,真正有价值的业务规则反而被挤到了角落里。这就是为什么“全功能后端”这个概念能引起这么多人共鸣——大家不是讨厌写代码,是讨厌写那些不得不写、又体现不出任何业务思考的代码。
2. 全功能后端拆解:94.7k Star 背后的六个内置能力
2.1 核心架构:从“集成一堆组件”到“开箱即用的产品”
传统后端项目的技术栈是拼出来的:Spring Boot + MyBatis Plus + Redis + MinIO + Spring Security,组件提供的是“零件”,你需要自己设计接线方式。全功能后端不一样,它把这些零件做成一个整体产品,你面对的是“功能”,而不是“组件”。
这就好比自己装修和住精装房的区别。自己装修当然灵活,但是要自己拉电线、铺水管、装开关;精装房则是进门就能住,住进去之后想改哪里再局部拆改。全功能后端把数据库、认证、文件存储、接口生成、后台管理界面全部包含进来,你不再需要为它们之间的协作关系操心。
2.2 全功能后端典型能力一览
以下我从实际使用体验出发,把这类项目最常被用到的能力列成一个表:
| 能力模块 | 解决了什么 | 传统方式的工作量 |
|---|---|---|
| 数据库与表管理 | 可视建表、自动生成 RESTful 接口 | 建表 SQL + 后端类文件 |
| 身份认证 | 邮箱密码登录、第三方登录、JWT | Spring Security / Shiro 配置 |
| 权限控制 | 按角色、按行精细控制访问 | 权限表 + 拦截器 + 注解 |
| 文件存储 | 图片、附件上传下载,私有/公共访问 | MinIO / OSS 集成 |
| 实时订阅 | 数据库变化实时推送到前端 | WebSocket 服务端开发 |
| 后台管理界面 | 数据浏览、用户管理、配置项编辑 | 单独开发一套管理端 |
这套能力覆盖了“做一个可用产品的后端”80% 左右的常规需求。剩下 20% 的复杂业务逻辑,再通过云函数或者自定义 API 补充。
2.3 为什么能 3 分钟搞定,而不是 30 分钟
关键不是操作速度快,而是省掉了“生成代码”这一步。传统低代码平台通常是根据表结构生成一套后端代码,你还要下载、导入 IDE、编译、部署,改完代码还要处理环境差异。全功能后端直接跳过代码生成,把表结构定义好的瞬间,接口就已经在线可用了。
我测试的时候,建了一张test表,字段填好、点保存,然后直接在浏览器地址栏访问/rest/v1/test,数据就返回了。那一刻确实有“这活儿是不是已经干完了”的恍惚感。
3. 我的 3 分钟跑通实录:从空项目到可用的增删改查接口
3.1 Step 1:创建项目实例
我拿一个对团队友好、支持自助托管的开源方案做验证。创建项目这一步和我以前在阿里云买数据库、自己初始化环境完全不一样,填一个项目名称、选一下所在区域、设置数据库密码,剩下的事情全交给平台。
有个容易忽略的细节:这类平台一般会同时分配一个 API URL 和 anon key,很多人创建完项目后把 anon key 直接丢在前端代码里,这是可行的,但“可用”和“安全”是两码事。后面我到权限那一节会详细讲,先记住一句话:anon key 只是你的客户端凭证,真正的数据保护靠的是行级安全策略,不是靠 key 保密。
3.2 Step 2:建表并生成接口
我建了一张文章表:
create table posts ( id bigint generated always as identity primary key, title text not null, content text, author_id uuid not null, created_at timestamptz default now() );在传统项目里,这张表建完还要写实体、写 Mapper、写 Service、写 Controller,至少一两个小时。在这里,表建完立刻可以通过 REST API 访问:
curl -X POST https://你的项目域名/rest/v1/posts \ -H "apikey: 你的anon-key" \ -H "Content-Type: application/json" \ -d '{"title":"测试文章","content":"内容","author_id":"某个用户id"}'返回结果直接就是新插入的数据,再配合分页参数select=*&order=created_at.desc&limit=10,一个带排序分页的列表接口就出来了。第一次看到这种响应速度,我还是有点吃惊的。
3.3 Step 3:前端接入
把前端接上去,代码也不再需要自己写 axios 封装,官方 SDK 已经把查询语法封装好了:
const { data, error } = await supabase .from('posts') .select('*') .order('created_at', { ascending: false }) .limit(10);登录认证同样走内置能力:
const { data, error } = await supabase.auth.signUp({ email: 'user@example.com', password: 'password' });到这里,我的“3 分钟”就结束了。如果算上从下载工具到配置环境的时间,实际大概是十来分钟,但这对于一个不需要写任何后端代码的流程来说,已经很夸张。
4. 表面省下的时间,最后都在权限、迁移和运维这里找了回来
4.1 权限与行级安全:最容易翻车的区域
全功能后端最大的坑在这里,没有之一。传统后端里,权限逻辑写在服务端代码中,你可以打断点、可以单测;在全功能后端里,权限逻辑下沉到了数据库层,通过行级安全策略控制。
很多项目创建之后,默认对公众开放读权限。也就是说,你的表是能被任何人通过 REST API 读走的,前提是 he 知道你的项目地址和 anon key。这俩东西在前端代码里都是公开的,所以真正的安全防线必须是策略本身。
给文章表加上“只能读写自己的数据”的策略,通常要写类似下面的 SQL:
create policy "用户管理自己的文章" on posts for all using (auth.uid() = author_id) with check (auth.uid() = author_id);这里auth.uid()是从 JWT 里解析出来的当前用户 ID,author_id是文章表里的字段。这一条策略加上之后,别人通过 API 查你的文章列表,只会看到自己的数据。
如果你跳过这一步,那跟把数据库密码贴在公网上没什么区别。我在测试一个类似产品时,遇到过两次因为策略漏配导致数据全公开的情况,好在那只是测试数据。这也是我建议所有准备采用这种方案的人第一件要学的事。
4.2 Schema 迁移与数据备份的工程化
在控制台里手动建表、改字段,开发阶段非常爽,生产环境就是灾难。团队里任何一个人手动改了一次表结构,其他人的本地环境就不同步了,代码评审也看不到这次变更。
正确的做法是把结构变更纳入版本管理。这类平台一般支持通过命令行工具管理迁移脚本,你可以把建表、修改字段、创建索引、更新策略全部写成 SQL 文件提交到 Git 里:
supabase/ migrations/ 0001_create_posts.sql 0002_add_comment_count.sql这样每次部署,执行一遍迁移,就能保证所有环境的表结构完全一致。这也是从“会用”走向“用得专业”的标志。
备份也一样。开发阶段容易忽视,生产环境必须开启定时备份并定期做恢复演练。恢复演练一定要做,不能只看到“备份成功”的提示就放心,真出问题的时候,恢复不回来等于没有备份。
4.3 部署形态:SaaS 托管还是自托管
全功能后端一般分为两种使用方式。
一种是使用官方托管的云服务,优势是省运维,数据库、备份、升级都不用自己管,适合快速上线。另一种是自托管部署,优势是数据完全在自己手里,适合有数据合规要求或需要私有化交付的项目。
自托管的成本容易被低估。表面上它就是一个容器编排文件的事情,跑起来之后你还要负责 PostgreSQL 的版本升级、定时备份、监控告警、磁盘扩容。如果一个团队的运维能力有限,我建议优先考虑托管服务,把精力放在业务上。
有一个折中方案,也挺常用:开发环境用自托管,生产环境用托管服务,或者反过来。只要数据模型和权限策略一致,切换成本可以接受。
5. 不硬贴:什么项目其实不适合用“全功能后端”
5.1 边界判断:四种不适合的情况
虽然有 94.7k Star 背书,但它不是万能药。以下四类情况,我劝你别硬套。
第一类,核心业务依赖复杂事务。比如订单支付、库存扣减、资金流水,这些业务需要 ACID 保证,跨表跨账务的事务一多,自动生成的单表接口就不够用了,你最终还是要写服务层代码。
第二类,权限模型非常复杂。比如一个文档系统里,有组织、部门、项目、自定义角色,还要支持按字段授权,这时你会在数据库策略里写出一大堆非常难维护的 SQL,还不如用代码实现。
第三类,系统需要长期演进且团队规模较大。团队成员一多,责任边界需要清晰:谁管表结构、谁管接口、谁管权限策略。全功能后端把后端代码压缩掉了,但“压缩”不等于“消失”,只是从代码变成配置和 SQL,代码评审和冲突解决的方式都变了。
第四类,需要深度定制的能力,比如特殊消息推送逻辑、自定义的文件处理流程、复杂的定时任务。如果每个定制都要绕开平台机制去实现,那这个平台的便利性就会被抵消。
5.2 混合架构:把它当“底座”而不是“全部”
我目前在实际项目里更建议的做法是混合架构:身份认证、文件存储、简单数据管理交给全功能后端,复杂业务单独保留一个轻量 API 服务。
比如一个内容管理平台:
- 认证、用户表、文章表、评论表:用全功能后端负责,前端直接读写;
- 文章审核流、消息推送、数据统计汇总:单独写一个生成任务服务,用服务端的密钥调用管理 API 或直接操作数据库。
这样既保住了“不需要写增删改查胶水代码”的效率,又给复杂业务留了可控的代码空间。
我在一次性搞过一个内部运营后台,数据模型有十来张表,团队里只有我和一个前端同事。当时如果让我写一套完整后端,少说一周;用这个方案半天就搭完了基础功能,剩下时间全在优化数据展示和权限细节。最后交付出来的效果,反而比传统方式更快、更稳。
但我也遇到过反例。有个项目负责人看到这类工具后,决定把已经写了半年的后端全部推倒重来,结果核心流程里有订单状态机、三方对接、复杂事务,折腾一个月后还是把服务层写了回来。工具本身没问题,问题出在“它什么都做得很好”和“你现在的场景真的需要它做什么”之间划了等号。
如果让我给一句实在建议:先把最担心出问题的一小块业务拿出来,用全功能后端搭一个最小验证原型,确认权限模型、数据隔离、迁移流程都符合你的要求,再决定要不要全面铺开。3 分钟建一个后端是真的,但你的业务约束不会只值 3 分钟,后半段才是真正考验架构能力的地方。