GoSqlGo 2.0 发布,HTML 里直接写 SQL 和业务代码

来源: 投稿
作者: yong9981
2021-02-21

GoSqlGo是一个运行在服务端的工具,开启了GoSqlGo服务后,前端可以直接在前端写SQL和Java代码操作后端数据库,独立完成简单的CRUD功能开发,不需要后端参与 。在开发结束后再通过打包工具,将前端的SQL和代码布署到后端服务器以实现安全性。

GoSqlGo的竞品是GraphQL之类在可以在前端进行业务操作的工具,但区别在于:
1.GoSqlGo支持直接在前端写SQL,GraphQL不支持
2.GoSqlGo支持在前端写Java,GraphQL不支持。
3.GoSqlGo不存在API,而GraphQL之类工具基于API及文档。没有API的优点是消除了前后端勾通成本,前端直接存取数据库,相当于左手递东西右手来接,开发效率当然是最高的。 

例如下面这个示例中所有的页面展示和后端逻辑都写在一个html里,是个单页面应用,小小一段html包含了5次GoSqlGo远程AJAX调用,也就是说,省略了五个API和文档:

<!DOCTYPE html>
<html>
 <head>
 <script src="/js/jquery-1.11.3.min.js"></script>
 <script src="/js/jquery-ajax-ext.js"></script>
 <script src="/js/gosqlgo.js"></script>
 </head>
 <body>
    <script>document.write($java(`return new WebBox("/WEB-INF/menu.html");`)); </script>
    <h2>Transaction demo, use jQuery</h2>
    <script> 
	  function getUserListHtml(){
		  var users=$qryMapList(`select * from account where amount>=? order by id`,0);
		  var html="User List:<br/>";
		  for(var i=0;i<users.length;i++) 
			  html+="User ID:" +  users[i].ID+", AMOUNT:"+ users[i].AMOUNT+"<br/>"; 
	      return html;		   
	  }
	</script>
	<div id="msgid" class="msg"></div> 
	<section>
		<header>Account A</header>
		<div id="A" class="amount">
			<script>
				document.write($qryObject(`select amount from account where id=? and amount>=?`, 'A',0));
			</script>
		</div>
	</section>
	<section>
		<header>Account B</header>
		<div id="B" class="amount">
			<script>
			    account=$qryEntity(`com.demo.entity.Account, select * from account where id=?`, 'B');
				document.write(account.amount);
			</script>
		</div>
	</section>
	<script>
	  function transfer(from, to, money){ 
			var rst = $$javaTx(`
					int money = Integer.parseInt($3);
					if (money <= 0)
					     return new JsonResult(0, "Error: Illegal input.");
					Account a = new Account().setId($1).load();
					if (a.getAmount() < money)
					     return new JsonResult(0, "Error:No enough balance!");
					Account b = new Account().setId($2).load();
					a.setAmount(a.getAmount() - money).update();
					b.setAmount(b.getAmount() + money).update();
					    return new JsonResult(200, "Transfer success!").setDataArray(a.getAmount(), b.getAmount());
			        `, from,to,money); 
		  $("#msgid").text(rst.msg);	
		  if(rst.code==200) { 
	 	      $("#"+from).text(rst.data[0]);
	 	      $("#"+to).text(rst.data[1]);
	 	      $("#msgid").css("background", "#dfb");
		  }
		  else $("#msgid").css("background", "#ffbeb8");		  
		}
	</script>
	<section>
		<header>Transfer</header>
		<form onsubmit="return false" action="##" method="post">
			<input id="amount" name="amount" value="100" class="amount">
			<button name="btnA2B" value="true" onclick="transfer('A','B', $('#amount').val())">From account A to account B</button>
			<button name="btnB2A" value="true" onclick="transfer('B','A',$('#amount').val())">From account B to account A</button>
		</form>
	</section>
 </body>
</html>

GoSqlGo的适用场景:
最适用于快速、原型开发、业务逻辑简单、业务与页面高度绑定的场合。GoSqlGo是独立的服务,通常使用token进行签权,可以与任意项目混搭使用,可以开启一个或多个GoSqlGo服务器实现与页面绑定的、简单的CRUD工作、以及所有简单到中等复杂度的SQL查询。理论上只要开启了GoSqlGo服务,所有的查询操作都可以在前端独立完成,不需要后端程序员参与。

GoSqlGo不适用场景:
复杂的业务、需要考虑业务重用的方法、以及要实现特殊功能(如文件上传等)的方法不适用GoSqlGo。这些方法留给传统的开发方式去完成即可。
为什么复杂的业务不适用?很简单,因为目前GoSqlGo把Java写在前端,相当于创造了一个"真.Javascript"脚本语言,目前这个脚本语言还没有IDE支持,当代码量大时,省略掉API的时间将被缺少IDE这个缺点抵消。

本次更新内容:
1. 将GoSqlGo做成一个独立的产品,而不再是必须作为Servlet插件存在。见server目录,双击run_server.bat即可启动GoSqlGo服务,它自带了一个Undertow Web服务器,缺省运行在80端口。
2.添加了develop_token配置。develop_token仅用于开发阶段,在开发阶段,当前端没有或传来的develp_token与服务端不符时将拒绝访问,以实现开发阶段的安全性。
3.添加了token配置和TokenSecurity接口,用户必须编写一个实现了TokenSecurity接口的实例。通过token、GoSqlGo方法ID来进行任意GoSqlGo调用方法的权限检查。server目录中的演示项目包含了用户登录和权限检查的简单示例。
4.在返回的JSON字段中添加了debugInfo字段,也就是说JSON返回内容扩充为{code, msg, data, debugInfo} 4个字段 。debugInfo这个字段可以返回服务端错误,包括编译错误,对于前端来说,不需要重启远程的后端GoSqlGo服务器,只需要修改html再刷新就可以进行除错定位,见下面图片:

GoSqlGo相当于是一个DIY版的Serverless服务器。
在开发阶段,要返回debugInfo字段,必须在gosqlgo.properties配置文件里配置debug_info=true,而在产品布署阶段则需要关闭这个debug_info字段输出以避免暴露服务端细节。

展开阅读全文
15 收藏
分享
加载中
精彩评论
这技术又倒回去了,哈哈哈
2021-02-21 14:56
25
举报
惊呆了
2021-02-21 18:59
5
举报
jsp
2021-02-21 16:52
5
举报
这东西具体使用什么技术,是不是倒退都不重要。重要的是这样的玩法不被绝大多数研发人员接受,这就足以说明问题了😂
2021-02-22 08:09
4
举报
这代码看着完全没有维护的欲望,完全不想接手
2021-02-22 00:13
3
举报
最新评论 (76)
如果需要nosql数据库,要怎么办?以及后端多数据源怎么办?
2021-02-23 08:42
0
回复
举报
GoSqlGO的所有qry方法都是定制的,用户也可以改造成使用NoSql或其它DAO工具,或干脆就在java方法里调用NoSql工具。GoSqlGO自带的jSqlBox是一个支持分库分表、多租户的DAO工具。
2021-02-23 10:24
0
回复
举报
唉。你面试的时候遇到一个人说他用一个特别的非主流框架开发五年了,开发效率很高,但是连个上传文件都要想一下,这真的让人很头疼。

现代的前端已经不只是单纯前端web页面,还可能需要多端。后端也要适合多端场景。这种适配下才能叫做全栈。你这个自己玩玩还可以,但是不适合企业级,因为创造不了价值,也不能帮助你下属成长,可以适应其他企业。
2021-02-22 11:28
1
回复
举报
已经说过了,复杂的、要重用的业务用传统方式开发即可。GoSqlGo可以另开单独的服务器或端口,专门用来处理简单的CRUD和只读查询,减轻后端开发工作量,GoSqlGo使用token,是支持跨域访问的。
GoSqlGo的返回对象是JSON,它的竞品是或GraphQL或APIJSON这类以数据库访问为主要目的的工具,并不是要做成一个大而全的web开发环境。
2021-02-22 11:44
0
回复
举报
看到首页介绍我就知道评论很精彩,确实,N年前JSP JSTL就有SQL标签,在页面写SQL。维护起来简直是噩梦。
2021-02-22 10:27
0
回复
举报
时代不同了,以前是后端维护HTML,当然吃力。现在是前端维护HTML的同时,再给他们开放写SQL的权限,通常限于简单的CRUD和只读查询而已,不至于增加太多他们的学习和维护压力。
2021-02-22 10:43
0
回复
举报
无非是将工作从一个人转移给另一个人,难道前端就不是人了?
2021-02-22 11:03
0
回复
举报
如果前端能因此得到更多的工作量分配,应该是好事,前端没活干等后端出API才是问题。
2021-02-22 11:18
0
回复
举报
前后端分离,是有原因的.
省掉五个API和文档, 代价太大.
2021-02-22 10:15
0
回复
举报
这个赞同,所以只适用于原型开发、简单的CRUD、只读查询。需要复用的、复杂的业务逻辑还是应该用API的方式提供,以方便多处调用。
2021-02-22 10:19
0
回复
举报
如果定位是简单的CRUD,前端是不是用这个更加好呢?https://gitee.com/Tencent/APIJSON
2021-02-22 11:09
0
回复
举报
APIJSON是专有格式,没有SQL好学和通用。而且光有API是不够的,对于需要处理一些简单业务逻辑的场合,还是需要引入一门脚本语言,我选择的是Java,因为它是后端通用语言,也方便随时利用工具软件将它转换为标准的Java类。
2021-02-22 11:37
0
回复
举报
太好了,期待更多的网站用起来
2021-02-22 10:10
0
回复
举报
太好了,后端终于不用负责数据交互逻辑了!
2021-02-22 10:01
0
回复
举报
是的,让后端有更多时间去陪恋人、家人和朋友!
2021-02-22 10:13
0
回复
举报
👍
2021-02-22 09:56
0
回复
举报
如何从MVC入门到V
2021-02-22 09:53
0
回复
举报
再发明一个可拆电池的手机就完美了。
2021-02-22 09:49
0
回复
举报
那还必须要发明万能充电器才能满足各种制式的电池
2021-02-22 11:38
0
回复
举报
原始的 PHP ?
2021-02-22 09:27
0
回复
举报
更多评论
76 评论
15 收藏
分享
返回顶部
顶部