导入功能包括上传文件和添加数据两步,创建模型如下
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportimplements IJSRuleOrdinaryModel{ @JsonAlias({"e"}) @JSRuleCheck(checkSubClass=true) public JSRuleImportExcel excel; }
目前导入只做了excel的导入,其excel模型如下
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportExcelimplements IJSRuleModel{ @JsonAlias({"c"}) @JSRuleCheck(checkSubClass=true) public C add; @JsonAlias({"s"}) @JSRuleCheck(checkSubClass=true) public List > sheets; @JsonAlias({"up","upload"}) @JSRuleCheck(required=true,checkSubClass=true) public JSRuleUpload uploads; @JsonIgnore public File file; public JSRuleImportExcel() { } }
这里我们看到JSRuleImportExcel模型和导出一样,它也有sheets属性,除此之外,它还有一个add属性和一个uploads属性,在前面的添加功能篇中已经具体说明了add属性的作用,这里再说一下uploads这个属性,先上代码
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleUpload implements IJSRuleOrdinaryModel,IJSFile{ @JsonAlias({"aPath"}) public String absolutePath; @JsonAlias({"rPath"}) public String relativePath; @JsonAlias({"data"}) public String base64Data; public JSRuleUpload() { } }
- absolutePath:已经上传过的在服务器上的excel文件的绝对路径
- relativePath:已经上传过的在服务器上的excel文件的相对路径
- base64Data:文件字节码,用base64编码成字符串后进行流传输,相当于上传文件的作用
说明:前面两个路径属性是用于在服务器搜索文件,也就是在导入前你已经将文件上传到了服务器上,如果没有提前上传,那么这里就属于设置base64Data属性,将用户本地文件转换成字节,再用base64编码将字节形成字符串,放入base64Data属性之中,以此来代替上传文件的动作,如下
"uploads":{ "base64Data":"UEsDBBQACAgIAFZ1CVUAA......这里是很长的一个字符串 }
注意:如果单独使用uploads上传模型,那么其中的路径表示存放在服务器的哪个路径下
最后再来看看JSRuleImportSheet的属性,先上代码
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportSheetimplements IJSRuleModel{ @JsonAlias({"c"}) @JSRuleCheck(checkSubClass=true) public C add; @JsonAlias({"h","head"}) public int headLine; @JsonAlias({"start"}) public int dataLine; @JsonAlias({"mapping","imports"}) public Map importJavaFieldMapping; public JSRuleImportSheet() { this.headLine = 1; this.dataLine = this.headLine+1; } }
我们看到这里的sheet也有一个add属性,它区别于上一层关系JSRuleImportExcel中的add,表示的是当前sheet对应的add属性,而JSRuleImportExcel中的add代表所有sheet默认的add属性,这里优先使用sheet对应的add属性
- headLine:头部行号
- dataLine:数据起始行号
- importJavaFieldMapping:excel中的头列名称与表字段的映射关系,因为在po中已经配置过了,这里实际上是不需要使用该参数的,使用该参数可以在本次请求中覆盖po中所配置的头列名称与表字段的映射关系
最后我们再用之前导出的excel文件再进行导入,如图
导入.jpg
可以看到头部行号为3,其中有字段名id,有中文名,这里与其对应的po配置如下
@JSRuleRelationTable(tableName= "zs_import") @Data public class ZsImport { @JSRuleRelationField(pk=true) private String id; @JSRuleRelationField(imports= {"名字","姓名"}) private String name; @JSRuleRelationField(fieldName= "birth_day",imports= {"生日"}) private Date birthDay; @JSRuleRelationField(fieldName= "qian",imports= {"金钱","money"}) private Double qian; }
可以看到这里可以定义多个中文名,例如name有名字和姓名,他们所对应的字段都是name,而name对应的表字段可从fieldName属性中读取,如果没有fieldName属性则默认就是本字段的名字name
此外,如果在导入时有多个相同列的值也没有关系,例如上面图片所显示的姓名和名字,最终只会形成1个列,而这里的/符号则会以null值处理
请求的json格式如下
{ "rule": { "name": "import", "actions": [ { "name": "test_import", "imports": { "excel": { "uploads":{ "aPath":"D:/response.xlsx" }, "add": { "class":"ZsImport2", "required":["name"] }, "sheets": [ { "head": 3, "start": 5, "add": { "class":"ZsImport", "uuid": ["id"], "required":["id","name"] } },{ "head": 2, "start": 4 } ] } } } ] } }
第二个sheet只有headLine和dataLine两个属性(这里的head和start是别名),其add属性是在上面excel对象中所定义的默认add属性,也就是class为ZsImport2的add属性
这里的add属性是复用了crud对象中的add属性,因此可以自定义规则,用于校验导入数据的合法性,自定义规则在前面的篇章中已经讲述过了,其原理一模一样
至此,当前版本中的7个action功能就已经说完了,后续将会利用该框架不断的加入新的功能,我们可以通过json就可以来完成这些后台接口的操作了,非常的低码