欢迎光临
我们一直在努力

3 秒建表、0 行代码:我开源了一个低代码平台,把 CRUD 按在地上摩擦

3 秒建表、0 行代码:我开源了一个低代码平台,把 CRUD 按在地上摩擦

新建一个客户管理,从建表到能增删改查、配好字段权限,30 分钟。后端代码 0 行。

代码在这儿,能跑:

https://gitee.com/houijun/low_code_out在这里插入图片描述

做过后台的都知道,下面这些活每个项目都要重写一遍:

  • 列表分页、关键字搜索、排序
  • 新增、编辑、删除、批量删除
  • 字段必填、长度、唯一、正则校验
  • 部门数据隔离、只能看自己创建的
  • 某个角色不能看金额字段
  • 删除进回收站、还能恢复
  • 操作日志、登录日志
  • 导入导出、模板下载

每个项目重写一遍,写完还得担心哪里漏了权限、哪里忘了加 f_is_deleted = 0。

这套平台把它们一次性做完了。新建实体 → 配字段 → 点建表 → 配菜单权限,完事。

一、30 分钟,从 0 到一个能用的客户管理

五步:

  • 实体设计器新建 customer,表名 t_customer
  • 加 8 个字段:类型、长度、必填、唯一、控件、校验
  • 点"建表",3 秒,先看 DDL 预览,再执行
  • 列表、表单、分页、搜索自动出来
  • 菜单挂入口,角色权限勾一下
  • 在这里插入图片描述

    不需要写 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、若依比

    维度JeecgBootNocoDB若依本项目
    路线 代码生成 数据表 脚手架 元数据解释
    新增业务模块 生成代码 配视图 写 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 骂,骂具体点。

    低代码不是不写代码,是把代码写一次,用一百次。

    赞(0)
    未经允许不得转载:171主机测评 » 3 秒建表、0 行代码:我开源了一个低代码平台,把 CRUD 按在地上摩擦
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址