若依的核心模块基本除了安全那一块,现在还是剩下一个比较重要的章节,是ruoyi-generator,就是代码根据模板来生成,这一块很有必要进行深入了解,本章节我们弄清楚基本框架,以后,我们会在这一块会根据开发内容持续跟进。为何需要重点关注呢?
使用脚手架,这是低代码的基本方向,程序员基本工作就是复杂逻辑还得自己动手,但是基本框架可以根据业务需求,编写对应的各层公共的程序,这个效率很有价值,并且减少不必要的手工错误,减少无价值的测试内容,把精力放在业务代码逻辑上。
代码生成模块结构比较清晰,如下图
Velocity 是一个基于 Java 的模板引擎框架,提供的模板语言可以使用在 Java 中定义的对象和变量上。Velocity 是 Apache 基金会的项目,开发的目标是分离 MVC 模式中的持久化层和业务层。但是在实际应用过程中,Velocity 不仅仅被用在了 MVC 的架构中,还可以被用在以下一些场景中。
1.Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。
2. 源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。有很多开源和商业开发的软件是使用 Velocity 来开发的。
3. 自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。使用 Velocity 可以在文本文件里面生成邮件内容,而不是在 Java 代码中拼接字符串。
4. 转换 xml:Velocity 提供一个叫 Anakia 的 ant 任务,可以读取 XML 文件并让它能够被 Velocity 模板读取。一个比较普遍的应用是将 xdoc 文档转换成带样式的 HTML 文件。
# 关键字
Velocity关键字都是使用#开头的,如#set、#if、#else、#end、#foreach等
$ 变量
Velocity变量都是使用$开头的,如:$name、$msg
{}变量
Velocity对于需要明确表示的Velocity变量,可以使用{}将变量包含起来。如在页面中,需要有$someoneName这种内容,此时为了让Velocity能够区分,可以使用${someone}Name。
!变量
如果某个Velocity变量不存在,那么页面中就会显示$xxx的形式,为了避免这种形式,可以在变量名称前加上!如页面中含有$msg,如果msg有值,将显示msg的值;如果不存在就会显示$msg。这是我们不希望看到的,为了把不存在的变量显示为空白,可以使用$!msg。
变量定义
#set($root = "www")
#set($name = "index")
#set($template = "$root/$name")
$template
执行输出结果:
www/index
变量赋值
赋值的左边必须是一个变量,或者是属性的引用。右边可以是:变量引用、字面字符串、属性引用、方法引用、字面数字、数组
#set($name = $bill) ##变量引用
#set($name.pre = "monica") ##字符串
#set($name.last = $address.num) ##属性引用
#set($name.mid = $hotel.find($web)) ##方法引用
#set($name.num = 123) ##数字
#set($name.say = ["yes",$my,"yes"]) ##数组
velocity会将属性解释为属性的get方法,如:
$foo.Bar 等同于 $foo.getBar()
$foo.User("join") 等同于 $foo.getUser("join")
$foo.Request.ServerName 等同于 $foo.getRequest().getServerName()
#set($mail = "foo")
$mail
\$mail
\\$mail
\\\$mail
执行结果如下:
foo $mail \foo \$mail
语法定义如下:
#foreach( 单个元素名称 in 集合)
....
#end
例子如下:
#foreach( $num in [2..-2])
this is $num.
#end
执行结果如下:
this is 2.
this is 1.
this is 0.
this is -1.
this is -2
语法定义如下:
#if(condition)
......
#elseif(condition)
......
#else
......
#end
&& 并且 || 或者 ! 取反
1. 单行注释##
##这里写注释
2. 多行注释#* *#
#*
这个写注释 可以写多行的注释
*#
语法定义如下:
#macro(宏的名称 $参数1 $参数2 .....)
语句体(即函数体)
#end
宏调用如下:
#宏的名称 ($参数1 $参数2 .....)
生成以上代码,前端和后端都有,还没有完全集成到代码中,为什么呢?
马上要启动组织管理的代码实现,所以我们可以用Radzen Blazor和若依的代码生成,同样使用脚手架,来验证到底哪个的开发效率更高。