x5springboot替换wex5后端baas服务

[2018.05.04修改]前言——环境配置如下:

开发系统:windows

wex5版本:wex5 3.6

本地jdk版本:jdk1.8_101

所有工程编码:UTF-8

 

1. UI改造

直接上图:

如上图,将system lib中的baas.js 服务指向修改,然后运行$WEX5_HOME/tools/dist/dist.bat使配置生效

2.数据源配置为本地开发环境数据源即可

3.wex5后端Baas服务配置

   注意此处也需要做配置,此处的配置纯粹为了与UI中baasData组件进行关联。截图如下:

新建目录:ecptest

新建服务:ecp_test_service

新建标准action:query_std_TEST_CUSTOMER(查询)、save_std_TEST_CUSTOMER(新增、更新、删除)

注意此处的自动生成的标准action前缀,我自己添加了_std_,此处为了改造后的springboot后端进行标准服务过滤区分

4.测试UI页面生成

前3步骤完成后,在UI2下新建应用—新建空白页, 添加基本组件:baasData、grid,为了方便测试添加保存、刷新按钮。

其中baasData关联之前步骤配置的数据源、数据表,关联2个标准action:query_std_TEST_CUSTOMER、save_std_TEST_CUSTOMER 。grid关联该baasData,简单添加几个可编辑的字段。

最后编辑的UI截图如下:

 

此时暂时无法启动测试,因为UI在步骤1 中已经将url指向了本机的另一个端口地址,即即将改造的后端服务

5.springboot框架替换baas服务端

在http://start.spring.io/ 中配置springboot基础pom,我检出的springboot版本1.5.10.RELEASE。pom.xml文件全贴出如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>net.jingbo</groupId>
	<artifactId>x5springboot</artifactId>
	<version>0.0.1</version>
	<packaging>jar</packaging>

	<name>x5springboot</name>
	<description>Refactor baas  to springboot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.24</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.25</version>
		</dependency>

		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc14</artifactId>
			<version>10.2.0.4.0</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

 

5.1.baas服务端的改造思路

UI只是对标准action的CURD,原标准baas肯定有对标准action的支持。从该思路出发扒源代码,首先只做简单迁移,启动后详细debug,发现不足,持续改进,基本都能解决。有个说明项,截图如下:

BaasController对比与源码中的BaasServlet,在UI中通过baas.js看到了所有的方法均为post提交,故只需做@PostMapping映射即可,对应的mapping代码:

@PostMapping(value={"/query_std_*","/save_std_*"})

 

其中 ecptest 对应为前文配置中Baas代码中的ecptest目录,ecp_test_service对应为前文配置中Baas代码中的ecp_test_service服务,最后的 * ,匹配2个标准action:query_std_TEST_CUSTOMER、save_std_TEST_CUSTOMER

 

5.1.1.自定义action实现

还有一种需求,在原Baas服务中称为自定义action,这种action使用场景多为视图取数,若涉及到对视图取到的数据做一些CRUD时就需要一些自定义的action去实现。首先看下自定义查询action在x5springboot中的实现思路,截图如下:

自定义一个mybatis interceptor,将匹配到查询的sql取出的结果进行加工,该sql匹配规则为:以mapstatement id 为queryX5Table开头的sql配置文件作为过滤条件,例如:queryX5TableByUserId、queryX5TableAllCustomers 等,sql的主键id一定要有。此处因为时间关系暂未编码demo,后续补上。 这种方式取出的数据,可填充至UI中的自定义data,以此展示数据。treeData以此类似。

2018年5月4日添加例子,UI部分截图如下:

此data使用自定义data,对应查询button  onClick触发查询的js代码如下(注意url配置,且action以queryX5Table为前缀):

Model.prototype.button1Click = function(event){
		var data=this.comp('data1');
		
		justep.Baas.sendRequest({
			"url":"/my",  
			"action":"queryX5TableNeedCancelOds",
			"params" : {},
			"success" : function(ret) {
				console.log(ret);
				data.loadData(ret);
				data.refreshData();
			},
			"error" :  function(ret) {
				console.log(ret);
			}
		});
	};	

自定义后端服务的url映射代码截图如下:

对应mybatis mapper查询代码如下:

标红的为重点,该ID对应到UI端 data的idColumn属性。固定写法因在mybatis intercepter中定死了将ID填充idColumn

至此,自定义data、自定义action取值功能完成

5.2. ActionContext作用

在几次debug后,发现ActionContext对于wex5来说也只是提供connection,并未发现其他用途,若有其他用途可留言,共同学习共同进步。该类删之。

5.3.数据源

使用druid,涉及到取数据源的地方,一律@Autowired注入

5.4.记录坑

在做集成测试时,发现一个小问题。先上图如下:

在源码CRUD.java类中,有一行代码:

conn.setAutoCommit(false);

在注释前跑测试时,每次的保存均不生效,调试良久。后来将该行代码注释,并添加了207行代码:

conn.commit();

每次执行完sql即提交。毕竟标准的CRUD均为单表的增删改查,个人认为不需考虑事务,有异议的大佬请留言轻喷。

 

至此,前后端改造基本完成。附个人理解:wex5针对的是移动端APP应用,UI方面也是稍微出彩。但是baas端的代码维护、jar依赖维护非常糟糕,这也是为何我坚持并习惯使用开源框架。奈何UI框架方面三大框架在国内已几乎霸占所有活跃的UI市场…

有人会问:wex5的思想就是前后端分离,然而现在开源社区非常活跃,开源社区足以做出非常出色的产品、程序,为了还费这力气搞baas后端的替换?若使用了springboot作为后端,相当于只把wex5当作UI使用,是否舍本逐末? 若使用了springboot作为后端,前端的react 、vue、angular已经三足鼎立,足够做出非常出色的业务系统、互联网UI了,用wex5的UI又有何用?

回答:公司领导要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值