前后端 | 低代码平台之 Erupt

前文提要

最近大家是不是都有那种危机感,项目变多了,工时压紧了,老板说,我不管你加不加班,我只看结果,项目经理说,我不管你用什么技术栈,我只要没BUG,测试说,交互不管好不好,我们只要搞光速推塔。你心说?那我走?

大家也发现了,以前要很多行代码才能实现的功能,现在变得格外简单,原因很多大佬开源了很多项目,很多大厂平台供我们选择,从此,无止尽的C+V操作变成了拼技术选型,拼方向,别人一行代码搞定的事情,一个类生成CRUD,你要不停的拷拷拷,BUG多数全凭心情,那为什么不选择一款开箱既用的产品呢?

功能概述

使用 Apache License 2.0 协议,源代码完全开源,无商业限制

代码生成器VSErupt
前端 + 后端 7 ~ 10 个文件文件数量仅需一个类文件
重新生成代码或修改已生成代码修改字段添加字段注解
需要手动执行建表 SQL建表语句自动建表
需要整个工程,模块众多不好管理初次部署仅需引入 Jar 依赖即可,基础数据自动生成
需要熟悉代码生成器所提供的前端 API,有一定学习成本前端代码零前端代码
传统分层调用的方式开发开发方式全注解式开发
仅支持基本的数据组件复杂的组件需自定义组件支持支持23类表单组件,且支持一对多,多对多等复杂关系组件
一般只支持 MySQL数据库支持 MySQL、Oracle、PostgreSQL、H2 等所有主流数据库
需要生成大量代码复制到项目中,功能越多维护成本越高开发时间仅需一个后端工程师,短时间就可以完成高质量后台管理系统
Java 代码逻辑扩展按需 @DataProxy 实现
表数量越多启动越慢启动速度百张表映射毫秒级初始化

 

 import: 支持多数据源

并且:项目内置了很多功能无需开发,开箱即用

 简单实力

简单CRUD

@Erupt(
       name = "简单的例子",
       power = @Power(importable = true, export = true)
)
@Table(name = "t_simple")   //数据库表名
@Entity
public class Simple extends BaseModel {

    @EruptField(
            views = @View(title = "文本"),
            edit = @Edit(title = "文本", notNull = true, search = @Search)
    )
    private String input;

    @EruptField(
            views = @View(title = "数值", sortable = true),
            edit = @Edit(title = "数值", search = @Search)
    )
    private Float number;

    @EruptField(
            views = @View(title = "布尔"),
            edit = @Edit(title = "布尔", search = @Search)
    )
    private Boolean bool;


    @EruptField(
            views = @View(title = "时间"),
            edit = @Edit(title = "时间", search = @Search(vague = true))
    )
    private Date date;

    @EruptField(
            views = @View(title = "滑动条"),
            edit = @Edit(title = "滑动条", type = EditType.SLIDER, search = @Search,
                    sliderType = @SliderType(max = 90, markPoints = {0, 30, 60, 90}, dots = true))
    )
    private Integer slide;

    @EruptField(
            views = @View(title = "下拉选择"),
            edit = @Edit(
                    search = @Search,
                    title = "下拉选择", type = EditType.CHOICE,
                    choiceType = @ChoiceType(fetchHandler = SqlChoiceFetchHandler.class,
                            fetchHandlerParams = "select id,name from e_upms_menu"
                    )
            )
    )
    private Long choice;

}

像这种带有CRUD功能的表单,只需要这样几行代码,一个文件就可以了

 那你选择写Controller、Service、Dao、View + HTML语法,还是写这几行代码呢?

简单上传附件

@Column(length = 120)
    @EruptField(
            views = @View(title = "附件",
                    type = ViewType.ATTACHMENT),
            edit = @Edit(title = "附件", type = EditType.ATTACHMENT,
                    attachmentType = @AttachmentType(fileTypes = {"PDF","PNG","JPEG","ZIP"}, maxLimit = 1))
    )
    private String fileUrl;

这是给你封装好的上传附件组件,无需其他代码,非常好用

一对多级联

@ManyToMany
    @JoinTable(
            name = "COMMON_ZY_SZHJXZY",
            joinColumns = {@JoinColumn(
                    name = "zbid",
                    referencedColumnName = "id"
            )},
            inverseJoinColumns = {@JoinColumn(
                    name = "ywid",
                    referencedColumnName = "id"
            )}
    )
    @EruptField(
            edit = @Edit(
                    title = "仿真实习实训软件面向专业",
                    type = EditType.TAB_TABLE_REFER,
                    notNull = true,
                    search = @Search(vague = true)
            ),
            sort = 45
    )
    private Set<ZyjsZyszView> zyjsZyszs;

高级用法

如果你的数据源不是项目链接的单标,是从接口或者其他库获得的,我们可以采用多数据源

代码实力

//注入启动类
@Bean
    public ApplicationRunner appRunner() {
        return new ApplicationRunner() {
            @Override
            public void run(ApplicationArguments args) throws Exception {
                DataProcessorManager.register("BndhdDataSource", BndhdDataService.class);
            }
        };
    }

实体类 

@Erupt(
        name = "SCHOOL_ACTIVITY_ZYJY",
        desc = "本年度活动表"
)
@EruptDataProcessor("BndhdDataSource")
@Entity
@Getter
@Setter
@DynamicInsert
@DynamicUpdate
@Power(delete = false)
public class Bndhd{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator = "sys_uuid")
    @GenericGenerator(name = "sys_uuid", strategy = "uuid")
    @Column(name = "id", length = 64)
    @EruptField
    private String id;


    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "学校名称",
                    desc = "学校名称",
                    width = "120"
            ),
            edit = @Edit(
                    title = "学校名称",
                    desc = "学校名称",
                    search = @Search(vague = true)
            )
    )
    private String XXMC;

    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "活动名称",
                    desc = "活动名称",
                    width = "120"
            )
    )
    private String HDMC;

    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "活动类型",
                    desc = "活动类型",
                    width = "120"
            ),
            edit = @Edit(
                    title = "活动类型",
                    desc = "活动类型",
                    search = @Search
            )
    )
    private String HDLX;

    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "活动开始时间",
                    desc = "活动开始时间",
                    width = "120"
            )
    )
    private String HDKSRQ;

    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "活动结束时间",
                    desc = "活动结束时间",
                    width = "120"
            )
    )
    private String HDJSRQ;

    @Column(length = 400)
    @EruptField(
            views = @View(
                    title = "目前状态",
                    desc = "目前状态",
                    width = "120"
            )
    )
    private String MQZT;
}

重写数据源方法 

@Service
public class BndhdDataService implements IEruptDataService {

    @Autowired
    private JdbcTemplateService jdbcTemplateService;

    @Override
    public PowerObject power(){
        PowerObject powerObject = new PowerObject();
        powerObject.setDelete(false);
        powerObject.setAdd(false);
        powerObject.setEdit(false);
        powerObject.setViewDetails(false);
        return powerObject;
    }

    @Override
    public Object findDataById(EruptModel eruptModel, Object id) {
        return null;
    }

    @Override
    public Page queryList(EruptModel eruptModel, Page page, EruptQuery eruptQuery) {
        Page pageResult = new Page();
        pageResult.setPageSize(page.getPageSize());
        String queryParam = "";
        // 职业教育活动周
        String zyhdzSql = "SELECT XXDM XXDM,HDMC,'职业教育活动周' HDLX,HDKSRQ HDKSRQ,HDJSRQ HDJSRQ FROM SCHOOL_ACTIVITY_ZYJY WHERE IS_DELETE = '0' ";
        // 文明风采
        String wmfcSql = "SELECT XXDM XXDM,HDMC,'文明风采' HDLX,HDKSRQ HDKSRQ,HDJSRQ HDJSRQ FROM SCHOOL_ACTIVITY_WMFC WHERE IS_DELETE = '0' ";
        // 其他
        String qtSql = "SELECT XXDM XXDM,HDMC,'其他' HDLX,HDKSRQ HDKSRQ,HDJSRQ HDJSRQ FROM SCHOOL_ACTIVITY_QT WHERE IS_DELETE = '0' ";
        // 大国工匠
        String dggjSql = "SELECT XXDM XXDM,HDMC,'大国工匠' HDLX,HDKSRQ HDKSRQ,HDJSRQ HDJSRQ FROM SCHOOL_ACTIVITY_DGGJ WHERE IS_DELETE = '0'";
        String queryMainSql = "";
        List<Condition> conditions = eruptQuery.getConditions();
        Map<String, String> keyToQueryMainSql = new HashMap<>();
        keyToQueryMainSql.put("职业教育活动周", zyhdzSql);
        keyToQueryMainSql.put("文明风采", wmfcSql);
        keyToQueryMainSql.put("其他", qtSql);
        keyToQueryMainSql.put("大国工匠", dggjSql);
        Boolean isDggj = true;
        for (Condition condition : conditions) {
            String key = condition.getKey();
            if (ObjUtil.isNotEmpty(condition.getValue())) {
                String value = condition.getValue().toString();
                if (key.equals("XXMC")) {
                    queryParam = " AND T.XXMC = '" + value + "'";
                } else if (key.equals("HDLX") && keyToQueryMainSql.containsKey(value)) {
                    queryMainSql = keyToQueryMainSql.get(value);
                    isDggj = false;
                } else if(key.equals("HDLX") && !keyToQueryMainSql.containsKey(value)){
                    queryParam = " AND T.XXMC = '」@「'";
                }
            }
        }
        if (isDggj) {
            StringBuilder sb = new StringBuilder();
            keyToQueryMainSql.forEach((k, v) -> {
                sb.append(v).append(" UNION ALL ");
            });
            queryMainSql = sb.substring(0, sb.length() - " UNION ALL ".length());
        }
        String dySql = "SELECT T.XXDM,T.XXMC,T.XXXZQHM AS REGIONID,REGION.NAME REGIONNAME,T.HDLX,T.HDMC,T.HDKSRQ,T.HDJSRQ, " +
                "case when to_date(T.HDJSRQ,'') > sysdate then '未结束' else '结束' end as mqzt " +
                "FROM ( " +
                "SELECT T.XXDM,T.HDMC,T.HDLX,T.HDKSRQ,T.HDJSRQ,SCHOOL_INFO.XXXZQHM,SCHOOL_INFO.XXMC " +
                "FROM " +
                "( " + queryMainSql + ") T " +
                "INNER JOIN SCHOOL_INFO ON ( T.XXDM = SCHOOL_INFO.XXDM) ) T " +
                "INNER JOIN REGION ON T.XXXZQHM = REGION.ID " + queryParam;
        String countSql = "SELECT COUNT(*) FROM (" + dySql + ") T";
        Integer count = jdbcTemplateService.getValue(countSql);
        long longValue = count.longValue();
        pageResult.setTotal(longValue);
        List<Map<String, Object>> bndhdList = new ArrayList<>();
        bndhdList = jdbcTemplateService.getListMap(dySql);
        pageResult.setList(bndhdList);
        return pageResult;
    }

    @Override
    public Collection<Map<String, Object>> queryColumn(EruptModel eruptModel, List<Column> columns, EruptQuery eruptQuery) {
        return null;
    }

    @Override
    public void addData(EruptModel eruptModel, Object object) {

    }

    @Override
    public void editData(EruptModel eruptModel, Object object) {

    }

    @Override
    public void deleteData(EruptModel eruptModel, Object object) {

    }
}

怎么样?喜欢玩攻速流的程序员们心动了吗?现在Enjoy your time!

erupt开源低代码框架,零前端代码,纯注解开发管理后台!icon-default.png?t=N7T8https://www.erupt.xyz/#!/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/655664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL学习进阶】从入门到高级应用(一)

文章目录 MySQL命令行基本命令数据库表的概述初始化测试数据熟悉测试数据 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f49d;希望您在这里可以感受到一份轻松愉快的氛围&#x…

算法002:复写零

力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/duplicate-zeros/ 使用 双指针 来解题&#xff1a; 具体思路 如果是和00…

【Linux】线程安全及锁的使用

文章目录 前言一、锁1.定义一个锁变量2.pthread_mutex_init3.pthread_mutex_destroy4.pthread_mutex_lock/pthread_mutex_unlock5.静态变量锁和全局变量锁的初始化 二、问题描述及锁的运用三、RAII风格的锁 前言 临界资源: 在多个线程或进程间共享的资源. 临界区: 代码中访问临…

echarts-象形柱图

象形柱图 一般的柱图都是纯色柱图&#xff0c;使用象形柱图可以给柱图定义自己的样式。 样式的调节与柱图一样&#xff0c;核心在于symbol调节柱图的组成。 let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3&qu…

【CTF Web】NSSCTF 3868 [LitCTF 2023]这是什么?SQL !注一下 !Writeup(SQL注入+报错注入+括号闭合+DIOS)

[LitCTF 2023]这是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 为了安全起见多带了几个套罢了o(▽)q 出题人 探姬 解法 先试试这个&#xff1a; )))))) or 11 -- 有结果了&#xff0c;但是这个 flag 是假的。 flag 可能在其他表里。用 hackbar 上 DIOS payload。 …

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成&#xff1a; // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库&#xff0c;且该文件夹下会有多个项目 首先在当前文件夹下新建git…

python--pycharm中将venv删除后怎么办

在终端中输入以下命令来创建一个新的虚拟环境&#xff08;可选&#xff09;&#xff1a; python -m venv venv 激活虚拟环境&#xff1a; Windows: .\venv\Scripts\activate选择自己项目的虚拟环境

网络故障排除—NAT-源进源出

多网络双出口一边是运营商A,一边是运营商B&#xff0c;将内网服务器分别映射到运营商B和运营商A出口。查了保证内部上网用户网速快管理员开启了运营商选路功能&#xff0c;运营商B的网站从运营商B出去&#xff0c;然后写有两条等价默认路由分别指向两个外网出口。营商A的网站从…

Angular(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目&#xff0c;可以使用 Angular CLI&#xff08;命令行界面&#xff09;。以下是使用 Angular CLI 创建一个新项目的步骤&#xff1a; 1、安装 Angular CLI&#xff1a; 打开你的命令行界面&#xff08;在 Windows 上是 CMD、PowerShell 或 Git Bas…

渲染管线——应用阶段

知识必备——CPU和GPU 应用阶段都做了什么 应用阶段为渲染准备了什么 1.把不可见的数据剔除 2.准备好模型相关数据&#xff08;顶点、法线、切线、贴图、着色器等等&#xff09; 3.将数据加载到显存中 4.设置渲染状态&#xff08;设置网格需要使用哪个着色器、材质、光源属性等…

区间类贪心,蓝桥云课 打折

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0打折 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 思路很简单&am…

回答篇二:测试开发高频面试题目

引用之前文章&#xff1a;测试开发高频面试题目 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 在测试开发中使用哪些自动化测试工具和框架&#xff1f;介绍一下你对其中一个工具或框架的经验。 a. 测试中经常是用的自动化测试工具和框架有Selenium、Pytest、Postman…

“盲人独立生活技能提升方案”:科技点亮希望之光

在追求平等与包容的社会进程中&#xff0c;盲人群体的独立生活能力提升成为了重要议题。随着科技的飞速发展&#xff0c;一款名为“蝙蝠避障”的辅助软件应运而生&#xff0c;以其独特的实时避障和拍照识别功能&#xff0c;为盲人在旅行乃至日常生活中开辟了新的可能。这不仅是…

OS复习笔记ch7-1

存储的基本管理需求 重定位 重定位(Relocation)&#xff1a;需要解决可执行文件中地址&#xff08;指令和数据&#xff09;和内存地址的对应。 一般有两种比较常见的重定位方式&#xff1a; 静态重定位(static relocation)&#xff1a;当程序被装入内存时&#xff0c;一次性…

刷代码随想录有感(81):贪心算法——分发饼干

题干&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index s.size() - 1;int res 0;for(int i g.size() - 1; i > 0; i--){if(index >…

SpringBoot使用redis结合mysql数据库(黑名单)渲染商品详情界面

目录 一、界面效果 二、前端代码 三、后端代码&#xff08;redisblacklist&#xff09; 3.1 ProducatController 3.2 ProductService 3.3 ProductDao 3.4 映射文件 一、界面效果 二、前端代码 商品详情前端代码 <template><van-nav-bartitle"商品详情&quo…

Redis 事件机制 - AE 抽象层

Redis 服务器是一个事件驱动程序&#xff0c;它主要处理如下两种事件&#xff1a; 文件事件&#xff1a;利用 I/O 复用机制&#xff0c;监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端&#xff08;或其他Redis 服务器&#xff09;发送网络请求触发。时间事件&am…

IDEA提示Untrusted Server‘s certificate

如果你用的是Intellij系列IDE&#xff08;GoLand, PHPStorm, WebStorm, IDEA&#xff09;&#xff0c;突然弹出个提示『Untrusted Servers certificate 』 莫慌&#xff0c;这是因为你用了破解版的 IDE&#xff0c;破解过程中有个hosts绑定的操作&#xff1a; 0.0.0.0 account.…

Langchain-Chatchat之pdf转markdown格式

文章目录 背景开发环境loader文本解析步骤markdown格式的文本为什么选择markdown格式测试markdown格式提取表格原pdf表格markdown格式的表格 测试markdown格式的知识库运行项目修改文件加载器loader 其他问题运行项目报错查看系统当前的max_user_watches修改sysctl.conf配置 图…

【数据结构】直接选择排序详解!

文章目录 1.直接选择排序 1.直接选择排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交换的时候&#xff0c;要及时更新 maxi &#x1f34e; 直接选择排序是不稳定的&#xff0c;例如&#xff1a; 9 [9] 5 [5]&#xff0c;排序后&#xff0c;因为直接选择排序是会…