Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展

LeeFJ
• 阅读 388
Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展
概述

  之前的文档中我们曾多次提及,Foxnic 的代码生成是迭代式的,当表结构变化后,需要重新生成相关的代码。例如某表增加了一个字段,那么对应的表结构元数据需要重新生成。此外,为了维护新加的字段也需要重新生成模块代码。

  这个时候,如果模块代码已经被开发人员修改,默认情况下,重新生成代码会覆盖开发人员修改过的代码。为了能够反复生成大多数的模块代码 Foxnic 设计了一套机制,尽可将影响降到最低。

  本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到,本文对照 webfull 项目讲解。

完整示例

  Foxnic-Web 项目提供代码生成的完整示例,请大家参考:

https://gitee.com/LeeFJ/foxnic-web/blob/1.7.0.RELEASE/common/generator/src/main/java/org/github/foxnic/web/generator/module/example/CodeExampleConfig.java

######

配置覆盖模式

  我们已经了解,代码生成时会生成一些列文件,一旦这些文件被修改,就不可以重新生成。代码生成配置类为开发人员提供了 configOverrides 方法,用于确定每组文件的写入模式。示例代码如下:

@Override
public void configOverrides() {
    //文件生成覆盖模式
    context.overrides()
        .setServiceIntfAnfImpl(WriteMode.COVER_EXISTS_FILE) //服务与接口
        .setControllerAndAgent(WriteMode.COVER_EXISTS_FILE) //Rest
        .setPageController(WriteMode.COVER_EXISTS_FILE) //页面控制器
        .setFormPage(WriteMode.COVER_EXISTS_FILE) //表单HTML页
        .setListPage(WriteMode.COVER_EXISTS_FILE) //列表HTML页
        .setExtendJsFile(WriteMode.CREATE_IF_NOT_EXISTS); // 扩展文件
}

  上面的代码为每组代码文件制定了写入模式,写入模式(WriteMode)包含若干选项:

选项 说明
WRITE_TEMP_FILE 如果文件已经存在,在边上生成一个 .code 文件
COVER_EXISTS_FILE 如果文件已经存在,直接覆盖原始文件;不存在就创建
CREATE_IF_NOT_EXISTS 如果文件不存在则创建,如果已存在就不处理
IGNORE 完全忽略,不做生成任何代码

  如果代码已经修改,我们可以考虑使用 WRITE_TEMP_FILE 或 IGNORE 模式。WRITE_TEMP_FILE 会在目标文件边上生成一个与目标文件同名的 .code 文件,可以将 .code 文件中的内容拷贝到已修改的源文件中。

文件覆盖标记

  实际的使用中,使用 configOverrides 方法配置源代码的写入模式还是会显的比较麻烦。如果代码生成工具可以自己识别代码是否已经被开发人员修改,这样就会更加方便。智能识别似乎有些困难,但是开发人员可以在文件修改后直接在文件加入一个标记,代码生成工具识别到这个标记时就不会重新生成改文件。

  在项目中,我们使用 @version 来作为文件已修改的标记,如图所示,在 Java 中可以这样:

Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展

  在 Js 文件中可以这样:

Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展

  在 Html 文件中可以这样:

Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展

逻辑扩展

  Foxnic 代码生成的原则是让开发人员尽量不修改生成的代码文件,但是业务逻辑的调整又无法回避,那么如何才能调和两者的矛盾呢?

  Foxnic-Web 通过业务逻辑扩展文件 xxx_ext.js 文件来解决前端代码修改的问题。针对后端代码,直接修改,尚未有这样的逻辑扩展文件。

  开发人员可以为 xxx_ext.js 文件加入 @version 标记,使 xxx_ext.js 文件不再被覆盖。xxx_ext.js 中包含了 form 和 list 两个对象,并且内置了诸多回调方法,开发人员可以将业务逻辑写入这些回调方法中,而不必去修改另外4个前端页面。这样另外四个前端页面就可以反复刷新代码。

  xxx_ext.js 文件如何使用,我们此处不做展开,后续章节专门对其进行深入探讨。

小结

  本节主介绍了代码生成的覆盖模式,覆盖模式作用域多个文件组成的代码组。为了方便起见,也可以在源码文件中加入 @version 标记使文件免于覆盖。另外,为了尽可能反复生成代码,我们引入了 xxx_ext.js 文件的扩展机制。

相关项目

  https://gitee.com/LeeFJ/foxnic

  https://gitee.com/LeeFJ/foxnic-web

  https://gitee.com/lank/eam

  https://gitee.com/LeeFJ/foxnic-samples

官方文档

  http://foxnicweb.com/docs/doc.html

点赞
收藏
评论区
推荐文章
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
2年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
2年前
Hibernate纯sql查询结果和该sql在数据库直接查询结果不一致
问题:今天在做一个查询的时候发现一个问题,我先在数据库实现了我需要的sql,然后我在代码中代码:selectdistinctd.id,d.name,COALESCE(c.count_num,0),COALESCE(c.count_fix,0),COALESCE(c
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
LeeFJ LeeFJ
1年前
Foxnic-Web 代码生成 (1) —— 开始生成代码
使用FoxnicWeb以及FoxnicSQL进行应用开发时,都可以支持代码生成。他们的区别是,基于FoxnicSQL的快速main函数启动的应用,只需要生成Model和Service即可。基于FoxnicWeb开发Web应用时,除了生成Model和Service以外,还要生成Proxy、Controller、UI界面等。  Foxnic的代码生成是基于数据表的,所以当表结构变更,甚至只是注释的调整,我们也是建议重新生成必要的代码。在Foxnic的体系中,我们认为最初的表结构设计、ER图设计,就是这个系统设计的起点。后续的程序设计或数据结构设计都是表结构设计的延续。  Foxnic的代码生成体系希望开发者可以有一个较高的开发起点,可以基于生成的代码直接开发应用,甚至是代码生成后无需修改就可以直接使用了。另一方面,我们又不关闭二次开发的开放性,毕竟自由的修改代码才是软件系统可以按需定制的终极路径。这也是Foxnic体系没有走无代码或低代码平台的原因。