迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:MyServerless开源软件地址:https://gitee.com/drinkjava2/myserverless开源软件介绍:MyServerless(原GoSqlGo)简介 | Description天下武功,唯快不破,MyServerless能让前端直接在HTML或Javascript里写业务代码和SQL,不需要后端程序员参与,从而实现快速开发。 MyServerless项目原名为GoSqlGo,因为考虑到它的开发模式有点类似于serverless,后端不参与具体业务开发,只提供基础API供调用,而且都是以方法作为最小而且是唯一的功能单元,所以从3.0版起项目更名为MyServerless。 MyServerless与通常的Serverless服务相比,主要区别是: 适用场合 | ApplicationsMyServerless适用于原型、快速、简单业务开发,以及前后端都是同一个人开发的场合,因为MyServerless是没有API的,也就不存在前后端联调沟通问题,所以开发效率高。 不适用场合 | Not ApplicableMyServerless不适用于复杂业务开发(比如脚本源码超过50行),原因是因为目前不具备IDE插件可以调试存放在前端的Java脚本,调试效率低,如果业务复杂时,在调试上花的时间还不如直接让传统后端程序员提供API和文档。 通常网站的API是由绝大多数的简单CRUD和少部分的复杂业务API组成,大项目可以考虑用MyServerless结合传统API方式来开发,开启一个MyServerless服务支撑简单的CRUD功能,剩下的复杂业务依然由传统后端程序员提供API和文档,这样可以节省后端程序员大部分的开发工作量。 使用 | Usage用实例来说明MyServerless的使用,以下示例直接在前端写SQL和Java脚本,实测通过,文件位于这里。 <html><head><meta charset="utf-8"><script src="/js/jquery-1.11.3.min.js"></script><script src="/js/jquery-ajax-ext.js"></script><script src="/js/myserverless-3.0.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> <p id="Users"> <script>document.write(getUserListHtml());</script> </p> <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(`#AccountTransfer //参数说明 $1:账号1的id $2:账号2的id $3:要转账的金额数 int money = Integer.parseInt($3); if (money <= 0) return new JsonResult(0, "Error: Illegal input."); Account a = DB.entityLoadById(Account.class, $1); if (a.getAmount() < money) return new JsonResult(0, "Error:No enough balance!"); DB.exe("update account set amount=amount-?",par(money)," where id=?",par($1)); DB.exe("update account set amount=amount+?",par(money)," where id=?",par($2)); return new JsonResult(200, "Transfer success!"); `, from,to,money); $("#msgid").text(rst.msg); if(rst.code==200) $("#msgid").css("background", "#dfb"); else $("#msgid").css("background", "#ffbeb8"); $("#"+from).text($qryObject(`select amount from account where id=?`,'A')); $("#"+to).text($qryObject(`select amount from account where id=?`,'B')); $("#Users").html(getUserListHtml()); } </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> 另外还有两个演示: 运行 | Dependency and RunMyServerless分为server和core两个目录,server目录是一个示范项目,使用时只需要将server项目作一些修改,如更改数据库连接和重写签权逻辑,即可以用于实际开发 。core目录是内核源码,除非要定制后端,用户一般不需要关心。 方法说明 | Methods在前端引入myserverless-3.0.js这个javascript库后,就可以直接在前端调用以下远程函数执行后端业务: $java(String, Object...) 在后端执行Java脚本,第一个参数是Java脚本源码,后续参数是业务参数,在Java脚本源码里可以用$1,$2...来代表。 $javaTx(String, Object...) 在后端执行Java脚本并开启事务,如果有异常发生,事务回滚。 $qryObject(String, Object...) 将SQL查询结果的第一行第一列值返回,第一个参数是SQL,后面是SQL参数,下同 $qryArray(String, Object...) 返回SQL查询的第一行数据,以Javascript数组对象格式返回 $qryArrayList(String, Object...) 返回多行查询结果,以数组列表格式返回 $qryTitleArrayList(String, Object...) 返回多行查询结果,以数组列表格式返回,第一行内容是各个列的标题 $qryMap(String, Object...) 返回SQL查询的第一行数据,为Map 格式 $qryMapList(String, Object...) 返回SQL查询的多行数据,为List<Map>格式 $qryEntity(String, Object...) 返回第一行数据为实体对象,SQL写法是实体类名+逗号+SQL, 示例:$qryEntity(`a.b.Demo, select * from demo`); $qryEntityList(String, Object...) 返回多行数据为List<实体>对象,SQL写法是实体类名+逗号+SQL, 示例:$qryEntityList(`a.b.Demo, select * from demo`); 注意以上远程函数调用的第一个参数是Java源码或SQL文本,要用键盘ESC下方的单引号括起来,这是Javascript的特殊单引号,支持多行文本。
$java('#ReadUserAmount import abc.DemoUser; return new DemoUser().loadById($1).getAmount();', 'u1'); 开发和布署 | Develop & Deploy在类根目录(项目的resources目录)下,有一个名为myserverless.properties的配置文件,可以进行配置,例如配置deploy目录、设定开发/生产阶段、设定develop_token和debug_inifo、打包时是否生成API等,详见它的注释。 开发阶段:MyServerless示范项目在服务端运行,它自带一个动态Java脚本编译功能,前端发来的SQL和Java脚本,被动态编译为实际的Java类,并执行这个Java类,最后返回JSON对象。 如果javascript方法前是两个$符号,如$$java,则返回一个JSON对象,它的data字段保存了返回结果。如果javascript方法前只有一个$符号,如$java,则返回的值直接就是Json的data字段。 布署阶段:双击server目录下的批处理文件go-server.bat,即可将前端所有的SQL和原生Java片段抽取到服务端去,转变为Java源文件,原有前端的SQl和JAVA代码在转换后将成为类似于$callDeployed('Xxxx_C9GK90J27','A');之类的通过ID进行的调用,以实现安全性。 安全 | Security在项目的myserverless.properties文件里,有以下关于安全的设计: 常见问题 | FAQ
相关开源项目 | Related Projects期望 | Futures如对MyServerless感兴趣请点个赞,或发issue提出完善意见 版权 | License关注我 | About Me![]() |
请发表评论