2009 年以来,因为一直从事数据相关的工作,与 Web 开发相隔甚远。在 2017 年学习 Spring Boot 前,一度非常恐惧 Asp.net MVC 的开发模式,编写大量的重复代码,复制粘贴修改再复制粘贴修改。没想到,Spring Boot 比 Asp.net MVC 更变本加厉,为了做一个接口,需要修改6
个文件!哪怕一个简单的只有一个 SELECT 语句的查询接口,也要修改 Pojo 类、MyBatis 查询、Mapper 映射、Service 方法、Controller 及逻辑,还可能需要 Enum 枚举类。冗长的开发过程大大降低了开发效率,即使有代码自动生成工具,也不能解决修改繁琐的问题。
2017 年,为了提速部门的数据开发工作,减少大量重复代码的编写,我开发出了 DataHub 多数据源框架。应用于部门数据开发的同时,也引入到了 Spring Boot 项目中。就这样,MyBatis 被干掉了,可以在 Controller 编写数据处理逻辑,也不需要再也 Pojo 类了。
即使这样,后端接口开发依然要写不少的冗余代码,比如要建立相应的 Controller,声明 DataHub 对象,通过 SQL 操作数据,关闭 DataHub 对象。2018 年,当部门要做一 Web 项目时发现部门内根本没有 Java 开发人员!于是花了两天时间,开发了 ApiInOne 工具(现在叫 OneApi)并提供了编辑页面,开发接口只需要写 SQL 即可。再后来,参照 Oracle 的 PL/SQL,不断增加了判断、循环等处理逻辑,可以让 ApiInOne 支持更广泛,已经可以解决 95% 以上的接口开发需求。
2019 年,为了解决大部分数据开发人员不会写 Python 或 Java 的问题,在 DataHub 基础中,开发出了 PQL 中间件语句,进一步简化了数据处理过程的编写。PQL 比 ApiInOne 中的 SQL 功能更强大,于是把 PQL 也应用到了 ApiInOne 中。至此,虽然依然在 Spring Boot 环境中,但编写接口已经不再需要编写 Java 代码,只需要一条或多条 SQL 语句即可,即几乎去掉了所有 SQL 之外的代码。
因为没有学 Vue,所以自己的 Web 项目并没有使用前后分离的模式开发,不过还是做到了页面和后端逻辑分离。新的问题又来了,当页面第一次加载时,前端页面需要展示数据,这些数据需要提前在 Controller 中取出来,然后通过 model 对象传递给页面,页面上使用 FreeMarker 或 ThymeLeaf 模板引擎进行展示。是的,依然需要在页面对应的 Controller 中写逻辑,同时需要写类和相应的方法。如果要向前端传递的数据比较多,那么 Controller 中的逻辑会非常复杂。为了能在前端展示不同的数据格式,还要记住非常多的 FreeMarker 或 ThymeLeaf 语法,麻烦呀。因为非常怀念 Asp 或 Jsp 的开发方式,所以自己基于 PQL 开发了一个模板引擎 Voyager,这样可以像写 Asp 或 php 一样在页面上写服务器端代码了,但是比 Asp 写的代码更少。就这样,我干掉了 FreeMarker。
编写页面回到了 Asp 时代,但是因为系统中大量交互的存在,仍需要编写非常多的事件和前端逻辑,也需要写非常多的 HTML 和 CSS。经常因为做的页面功能和样式差不多,也经常要复制粘贴修改。终于,在开发一个新模块时,一个新的页面和另一个模块的某个页面基本相同,复制过来代码后,还没有修改,我忍不住停了下来,开始思考新的解决方法。
我想干掉 HTML,也想干掉 CSS,更想干掉 Javascript,期望有一种更更简单的方式制作页面,并且将前端和后端统一起来。