因为代码生成器涉及到了太多次的提交 如下图所示git的提交记录 ![](https://img.kancloud.cn/02/3c/023c55fb69137574195742ad2b5808b2_1230x672.png) 所以今天我们做一个总的记录 ### 首先我们有单独的代码生成器模块generator,这个模块除了生成持久层的代码之外同时我们今天也将它打造为控制器、service、新增请求类、查询请求类、结果返回类的代码都在这个模块下生成 ### 前面讲过的mybatis持久层代码如何生成的我们就不废话了,去看前面的文章就行 ### 第一步:首先在generator子模块的pom.xml当中增加如下依赖 ![](https://img.kancloud.cn/11/9d/119d71646d7e63315adc958f2f867411_1469x970.png) ### 第二步:在generator子模块的resource当中的generator-config-member.xml当中的最后 ![](https://img.kancloud.cn/64/eb/64eb39950c012b9163703e65b861330e_1808x947.png) 如上图所示这里规定了要对哪个表要生成持久层的代码以及生成的代码的类的名称是什么 虽然是mybatis持久层但是我们生成自定义的其他代码也需要用到,因为在生成service的时候就需要使用到mapper 但是mapper的名称就是根据这里的Passenger来命名的 **所以在整个的自定义代码生成器当中 上图当中的两个名字非常关键!!!** ### 另外这里提到的generator-config-member.xml只是一个案例当然你也可以使用别的名字但是我们这里就约定是使用这种方式来命名,**尤其关键的是最后的member一定要和子模块的名称对其!!!因为在生成控制器或者service或者其他请求和返回结果类的时候一定有所在的模块是哪个,就是取得这个文件名称的最后一个单词作为模块名称** ### 这是两个非常值得注意的地方,后面讲到我们也会标注出来 ### 接下来我们截图代码梳理一下整体的步骤,具体细节还是去看git版本提交信息或者直接去读我的源代码也行 ### 1、先看一下整体目录结构 ![](https://img.kancloud.cn/92/76/9276ed0178a62e7c7c5b485bfd4447d6_1668x992.png) ### 2、获取generator/pom.xml节点信息拿到定义的之前持久层代码生成器用到的配置文件路径 ![](https://img.kancloud.cn/28/b2/28b258f2c8ee08f71d868d38861b4b26_1691x939.png) ![](https://img.kancloud.cn/10/f8/10f883e540fca1aa3709e2c4018fca52_1819x1005.png) ### ![](https://img.kancloud.cn/55/9e/559e47e46406c72b7d59ec7dda03f732_1556x854.png) ### 如下图所示这样就拿到了src/main/resources/generator-config-member.xml当中的member子模块的名称 ![](https://img.kancloud.cn/1f/23/1f23a4f61a42b52afc0f107eca8e570c_1583x950.png) ### 接下来去拿表名称和对应的类名称: ![](https://img.kancloud.cn/44/13/4413ce3d65e69bec88d67da3549ae400_1584x903.png) ### 接下来除了我们要生成service、控制器等后端代码我们考虑将前端vue的代码也一起生成了,但是前端的页面当中的表单等数据肯定是根据数据库字段名称以及类型以及注释等信心来生成的 ### 所以我们需要拿到src/main/resources/generator-config-member.xml当中的数据源信息也就是如下图所示的里面的元素信息的值: ![](https://img.kancloud.cn/44/ff/44ff7e1e05a939fe36020bef6cb9f5aa_1806x911.png) ### 如何拿呢?如下图所示 ![](https://img.kancloud.cn/a2/b9/a2b984cbd32f54fd09011e581f4fda0b_1520x878.png) ### 拿到之后我们需要链接数据库啊 我们使用传统的jdbc去链接数据库就行 所以我们写了一个DbUtil工具 ### ![](https://img.kancloud.cn/59/53/59531491f7f13ba71a8fc581c28db4d1_1373x990.png) ### 如何存储这些字段的信息呢?所以我们还定义了一个Field字段类 ![](https://img.kancloud.cn/f5/a0/f5a0737bba8e2fe9e4c1bf63fe749490_1328x965.png) ### 然后就是使用DbUtil工具类去获取表和字段的一些信息了 ![](https://img.kancloud.cn/84/3e/843e38fa1f1301187a5a3c0c00a5f717_1353x831.png) ### 尤其是在获取字段列的一些信息的时候有一些特别需要注意的地方 ![](https://img.kancloud.cn/11/cf/11cfa612bda6377763e86aa109615bb0_1439x993.png) 如上图所示: **第一点就是字段的注释信息 如果是 “旅客|xxxxxxxx“的那么我们就直接取|前面的作为字段注释信息; 第二点就是字段的长度,主要是针对varchar类型来设置长度,如果不是varchar类型那么长度统统为0; 第三点就是枚举类型,枚举的注释一定要这么写:枚举[CourseLevelEnum] 一定要有枚举两个字然后中括号里面就是枚举的名字一定要带着后缀Enum 我们会根据枚举两个字判定这个字段是不是枚举类型 然后拿到CourseLevel作为枚举的名字去后端枚举类读取枚举数据** ### ![](https://img.kancloud.cn/e6/ea/e6ea06025295a59dfc8208cd4e3539f8_1309x698.png) ### 最后就是将数据整合组装参数 ![](https://img.kancloud.cn/31/7d/317dafacff8bd5934d242426cf49937c_1233x757.png) ### 然后我们先说一下生成后端代码的方法gen() ### ![](https://img.kancloud.cn/8d/9c/8d9c88cfcaf014e3e49f9356807eed4d_1715x966.png) ### 所以这里尤为重要的就是ftl的模版了 ### 思路一般是这样的:先写一套标准的CURD的后端接口然后拷贝过来改造成模板就行 比如控制器的模版就是根据标准的控制器改造而来的 用标签替换掉之前写死的类名称等信息 ![](https://img.kancloud.cn/a2/c7/a2c797e32848299fd6065e3bdf539603_1862x960.png) ### 请求类的模版比较简单 因为我们需要生成的是标准的代码 像之前在里面写的各种条件判断统统不要 生成好请求类代码之后再去改就行 ![](https://img.kancloud.cn/46/9a/469afbcd381d634dfec2541e9a66cf0e_1161x691.png) ### 结果返回类更复杂哈 ![](https://img.kancloud.cn/9d/95/9d954d6d497b080d3384ca1026211103_1355x959.png) ### 最后就是根据gen()方法来生成对应的后端代码了 ### 接下里我们看一下前端vue的代码是如何生成的额? 其实比后端代码的业务逻辑简单多了 ![](https://img.kancloud.cn/e5/ce/e5ce78a01142300f9231d6aac0c10a6a_1308x943.png) ### 看一下vue.ftl模版不难发现也是进行的模版变量的替换 ![](https://img.kancloud.cn/83/54/83546b7140da0b160cf88af72ad22a86_1452x993.png) ![](https://img.kancloud.cn/08/78/08783c1c31bce2fd10bdfc0be32202bd_1213x867.png) 当然模版也不是一触而就的 需要改好多次好多次好多次 我擦!!! ### 但是最为重要的一点就是枚举类型在前端的显示 ### ![](https://img.kancloud.cn/6e/16/6e16349f7e619f5decfbad22209ae4dd_1157x864.png) ### 通过后端传递的参数就已经拿到了对应的枚举的变量名称 比如字段注释信息为枚举[CourseLevelEnum]那么返回的枚举名称就是CourseLevel ### 本身我们是直接手动写死在前端代码里面的 ![](https://img.kancloud.cn/b1/1f/b11fb6e4268b5fac207f638039c66248_1595x802.png) ### 可是这样也不行啊 总不能后端写一个枚举类 前端就跟着写一个枚举js啊!当然也可以这么玩 不过我们又写了一个前端枚举代码生成器 ### ![](https://img.kancloud.cn/2d/86/2d860145368bc866a87ee52658aa7e2f_1649x959.png) #### 并且生成两种格式的枚举数据 ![](https://img.kancloud.cn/8b/4b/8b4bcf0e777c8dd27f7a234686d598e8_1361x445.png) ### 在整个的设计过程当中约定了一些规范!!! 使用的时候也请遵守这些规范!!! 否则会有意外报错产生!!!