3 秒建表、0 行代码:我开源了一个低代码平台,把 CRUD 按在地上摩擦
新建一个客户管理,从建表到能增删改查、配好字段权限,30 分钟。后端代码 0 行。
代码在这儿,能跑:
https://gitee.com/houijun/low_code_out
做过后台的都知道,下面这些活每个项目都要重写一遍:
- 列表分页、关键字搜索、排序
- 新增、编辑、删除、批量删除
- 字段必填、长度、唯一、正则校验
- 部门数据隔离、只能看自己创建的
- 某个角色不能看金额字段
- 删除进回收站、还能恢复
- 操作日志、登录日志
- 导入导出、模板下载
每个项目重写一遍,写完还得担心哪里漏了权限、哪里忘了加 f_is_deleted = 0。
这套平台把它们一次性做完了。新建实体 → 配字段 → 点建表 → 配菜单权限,完事。
一、30 分钟,从 0 到一个能用的客户管理
五步:

不需要写 Entity、Mapper、Service、Controller,也不需要写 Vue 列表和表单。
二、你少写的不是 1200 行,是 20 个模块的 2.4 万行
传统写法,一个客户管理:
建表 SQL 30 行
Entity / DTO 60 行
Mapper + XML 80 行
Service 150 行
Controller 80 行
列表页 Vue 250 行
表单页 Vue 300 行
权限、菜单、部门数据范围 100 行
回收站、导入导出、操作日志 150 行
———————————————–
合计 约 1200 行
一个模块 1200 行,一年 20 个模块就是 2.4 万行。这些代码不写,bug 少一半。
平台写法:0 行。
三、它凭什么能做到:元数据是源代码
大多数低代码把元数据当配置:几张表记一下实体和字段,用的时候查出来拼 SQL。做到第二周就会发现问题。
元数据是源代码,物理表是编译产物。 源码丢了,产物就改不动;产物和源码对不上,系统就开始说胡话。
所以建表不是执行用户输入的 SQL,是编译元数据:
public static Preview createTable(MetaEntity entity, List<MetaField> fields) {
String tableName = entity.getTableName();
List<String> lines = new ArrayList<>();
lines.add(" `f_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键'");
lines.add(" `f_dept_id` BIGINT NULL COMMENT '部门'");
lines.add(" `f_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP");
lines.add(" `f_created_by` BIGINT NULL COMMENT '创建人'");
lines.add(" `f_updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP");
lines.add(" `f_is_deleted` TINYINT NOT NULL DEFAULT 0");
lines.add(" `f_version` INT NOT NULL DEFAULT 0");
for (MetaField field : fields) {
lines.add(columnDefinition(field)); // 类型 + 长度 + NULL + 默认值 + 注释
}
return new Preview(tableName, "CREATE TABLE …", warnings);
}
注意内置列:部门、创建人、更新时间、逻辑删除、乐观锁。每一列都对应一类后台刚需,不是拍脑袋加的。
加字段就是一条 ALTER:
public static String addColumn(MetaEntity entity, MetaField field) {
return "ALTER TABLE `" + entity.getTableName() + "` ADD COLUMN "
+ columnDefinition(field);
}
加完字段,通用接口自动多返回一个字段,前端不用发版。
四、一个接口,吞掉所有 CRUD
传统后台,一个实体一套 Controller。十个实体,十套几乎一样的代码。
这套平台,业务数据只有一个入口:
POST /api/gateway
{
"routeCode": "customer.page",
"params": { "pageNo": 1, "pageSize": 20, "keyword": "杭州" }
}
api 查路由、验权限、签内部票据,转发给 bussiness;bussiness 查元数据、拼 SQL、裁字段、返回。
不把 JWT 带进内网,票据 300 秒过期,HMAC 签名,再叠内网 IP 白名单。内网服务不该信任外部令牌,这是底线。
五、权限细到字段,这块大多数后台没有
权限分三层:菜单、实体动作、数据。
数据落到代码里就两件事:能看哪些行,能看/改哪些字段。
行级 5 种:全部、本部门、部门树、本人、自定义。多角色取最宽。
switch (scope.toUpperCase()) {
case "ALL" -> { /* 不加条件 */ }
case "SELF" -> where.append(" AND f_created_by = ?");
case "DEPT" -> where.append(" AND f_dept_id = ?");
case "DEPT_AND_CHILD" -> where.append(" AND f_dept_id IN (…)");
case "CUSTOM" -> where.append(" AND (").append(customScopeSql).append(")");
}
字段级默认不限制。一旦配了字段权限,读的时候过滤,写的时候拦截:
private void rejectUnwritable(String entityCode, Map<String, Object> payload) {
Long userId = UserContext.getUserId();
Set<String> writable = permissionResolver.writableFields(userId, entityCode);
if (writable == null) return;
for (String key : payload.keySet()) {
if (!writable.contains(key)) {
throw new BizException(ErrorCode.FORBIDDEN, "字段不可写:" + key);
}
}
}
只做读裁剪、忘了写裁剪,是这类系统最常见的漏洞。没读权限的字段,照样能被构造请求写进去。

对比:若依有 RBAC 和部门数据范围,字段级没有;NocoDB 权限到表/视图;JeecgBoot 有字段显隐和导出权限,细到读写要定制。
这套平台把字段读写做进了权限模型,配一下就行。
六、上线才想起的脏活,默认就有
- 回收站:删除进回收站,能恢复、能彻底删
- 幂等:请求头 + Redis,10 分钟防重
- 限流:登录 20/分钟、令牌 30/分钟、网关 600/分钟
- traceId:响应头 X-Trace-Id,全链路
- 审计:操作日志异步落库
- 缓存:元数据本地 TTL + Redis 版本号
- 索引补建:部门、创建人索引一键补
- 密码策略:长度、字符种类、弱口令
单个都不难,难的是每个项目重来一遍。平台的价值就是把这些变成默认。
七、跟 JeecgBoot、NocoDB、若依比
| 路线 | 代码生成 | 数据表 | 脚手架 | 元数据解释 |
| 新增业务模块 | 生成代码 | 配视图 | 写 CRUD | 零代码 |
| 字段级权限 | 部分(显隐/导出) | 弱 | 无 | 读写都管 |
| 行级数据范围 | 部门权限 | 视图过滤 | 5 种 | 5 种 |
| 页面 DSL | 有 | 有 | 无 | 没有,在做 |
| 适合谁 | 复杂业务 | 轻量数据 | 传统后台 | 内部管理系统 |
JeecgBoot:代码生成强,生成完二次开发容易被覆盖;字段显隐有,读写权限要补。适合一次成型的项目。
NocoDB:建表快、视图漂亮,但字段级权限、部门树、审计不是主线。做通讯录够用,做 CRM 要还债。
若依:RBAC 正、代码干净,但每加一个模块,Controller、Service、Mapper、Vue 一行不少。是脚手架,不是低代码。
这套平台:元数据解释执行,业务表零代码,字段级权限内置。代价是页面还写死、改字段类型还锁着、生态小。
八、跑起来
环境齐了,建库、导 SQL、编译、起四个服务、起前端,README 里能直接复制。
mysql -uroot -p -e "CREATE DATABASE low_code_new DEFAULT CHARSET utf8mb4"
mysql -uroot -p low_code_new < houyiun-platform/houyiun-meta/src/main/resources/db/meta_schema.sql
mysql -uroot -p low_code_new < houyiun-platform/houyiun-api/src/main/resources/db/sys_schema.sql
mysql -uroot -p low_code_new < houyiun-platform/houyiun-api/src/main/resources/db/api_route_seed.sql
mysql -uroot -p low_code_new < houyiun-platform/houyiun-api/src/main/resources/db/sys_menu_seed.sql
cd houyiun-platform && mvn clean package -DskipTests
java -jar houyiun-meta/target/houyiun-meta-1.0.0-SNAPSHOT.jar
java -jar houyiun-bussiness/target/houyiun-bussiness-1.0.0-SNAPSHOT.jar
java -jar houyiun-log/target/houyiun-log-1.0.0-SNAPSHOT.jar
java -jar houyiun-api/target/houyiun-api-1.0.0-SNAPSHOT.jar
cd ../frontend && npm install && npm run dev
浏览器打开 http://localhost:5173。
- 管理员:admin / admin123
- 只读账号:tester / admin123

九、适合谁,不适合谁
适合:
- 内部管理系统、表单型业务
- 需要字段级权限、部门隔离、回收站
- 想找一个能改、能读、没有黑盒的底座
不适合:
- 高并发交易、复杂计算
- 拖拽画布、大屏、报表设计器
- 开箱即用、零学习成本
丑话:
- MVP,别直接上生产
- 页面还写死,页面 DSL 在做
- 改字段类型还锁着,变更单在做
- MIT License,商用随便
十、地址
https://gitee.com/houijun/low_code_out
觉得能省你几天,点个 star。觉得哪里蠢,提 issue 骂,骂具体点。
低代码不是不写代码,是把代码写一次,用一百次。



