若依项目学习笔记10——代码生成

1. 代码生成

大部分项目里其实有很多代码都是重复的,几乎每个基础模块的代码都有增删改查的功能,而这些功能都是大同小异, 如果这些功能都要自己去写,将会大大浪费我们的精力降低效率。所以这种重复性的代码可以使用代码生成

1.1 使用流程

由于个人时间缘故,代码生成的具体使用和内容介绍这里先暂时放一下,后面这块再补充

  1. 修改代码生成配置
  • 单应用编辑 resources 目录下的 application.yml
  • 多模块编辑 ruoyi-generator 中的 resources 目录下的 generator.yml
  • author: # 开发者姓名,生成到类注释上
  • packageName: # 默认生成包路径
  • autoRemovePre: # 是否自动去除表前缀
  • tablePrefix: # 表前缀
  1. 新建数据库表结构(以下分别为单表和树表)
drop table if exists sys_student;
create table sys_student (
  student_id           int(11)         auto_increment    comment '编号',
  student_name         varchar(30)     default ''        comment '学生名称',
  student_age          int(3)          default null      comment '年龄',
  student_hobby        varchar(30)     default ''        comment '爱好(0代码 1音乐 2电影)',
  student_sex          char(1)         default '0'       comment '性别(0男 1女 2未知)',
  student_status       char(1)         default '0'       comment '状态(0正常 1停用)',
  student_birthday     datetime                          comment '生日',
  primary key (student_id)
) engine=innodb auto_increment=1 comment = '学生信息表';

drop table if exists sys_product;
create table sys_product (
  product_id        bigint(20)      not null auto_increment    comment '产品id',
  parent_id         bigint(20)      default 0                  comment '父产品id',
  product_name      varchar(30)     default ''                 comment '产品名称',
  order_num         int(4)          default 0                  comment '显示顺序',
  status            char(1)         default '0'                comment '产品状态(0正常 1停用)',
  primary key (product_id)
) engine=innodb auto_increment=1 comment = '产品表';
  1. 新建数据库表结构(主子表)
-- ----------------------------
-- 客户表
-- ----------------------------
drop table if exists sys_customer;
create table sys_customer (
  customer_id           bigint(20)      not null auto_increment    comment '客户id',
  customer_name         varchar(30)     default ''                 comment '客户姓名',
  phonenumber           varchar(11)     default ''                 comment '手机号码',
  sex                   varchar(20)     default null               comment '客户性别',
  birthday              datetime                                   comment '客户生日',
  remark                varchar(500)    default null               comment '客户描述',
  primary key (customer_id)
) engine=innodb auto_increment=1 comment = '客户表';


-- ----------------------------
-- 商品表
-- ----------------------------
drop table if exists sys_goods;
create table sys_goods (
  goods_id           bigint(20)      not null auto_increment    comment '商品id',
  customer_id        bigint(20)      not null                   comment '客户id',
  name               varchar(30)     default ''                 comment '商品名称',
  weight             int(5)          default null               comment '商品重量',
  price              decimal(6,2)    default null               comment '商品价格',
  date               datetime                                   comment '商品时间',
  type               char(1)         default null               comment '商品种类',
  primary key (goods_id)
) engine=innodb auto_increment=1 comment = '商品表';
  1. 登录系统(系统工具 -> 代码生成 -> 导入对应表)

  2. 代码生成列表中找到需要表(可预览、修改、删除生成配置)

  3. 点击生成代码会得到一个 ruoyi.zip 执行sql文件,按照包内目录结构复制到自己的项目中即可

多模块所有代码生成的相关业务逻辑代码在ruoyi-generator模块,可以自行调整或剔除

1.2 实现详解

1.2.1 入口

我们打开数据库的sy_menu表,找到代码生成项,可以看到所调用的路径

我们打开vscode找到这个路径,进到index中

包括了代码生成界面的展示:

  • 其中预览部分就是我们在代码生成界面点击预览的新窗口,里面包括代码生成的内容,这里使用的是 <el-tab-pane去循环显示的;
  • import importTable from "./importTable";的作用是导入本目录中的importTable.vue,作用是在后台查询数据库表格并导入;调用了 api.ool.gen.js 的 listDbTable() 方法,查询的url为 /tool/gen/db/list

1.2.2 数据库查询

接下来我们回到idea,找到 generator.controller.GenController ,根据上面查询数据库列表的url找到 dataList() 查询数据库列表方法,根据其中的 selectDbTableList() 方法,在mapper文件中找到对应的sql方法

select table_name, table_comment, create_time, update_time from information_schema.tables
		where table_schema = (select database())
		AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%'
		AND table_name NOT IN (select table_name from gen_table)
  • information_schema.tables:mysql默认查询数据库表格的语法
  • 该sql语句中,默认剔除了定时任务和代码生成表格

1.2.3 导入

查询后,前端的 importTable.handleImportTable() 会调用后端 GenController 的 importTableSave() 导入表结构方法,见下

@PreAuthorize("@ss.hasPermi('tool:gen:list')")
@Log(title = "代码生成", businessType = BusinessType.IMPORT)
@PostMapping("/importTable")
public AjaxResult importTableSave(String tables)
{
    String[] tableNames = Convert.toStrArray(tables);
    // 查询表信息
    List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
    genTableService.importGenTable(tableList);
    return AjaxResult.success();
}

我们看到里面的 importGenTable() 方法,CTRL+左键 进到接口方法中,CTRL +ALT + 左键(或者右键-go to-implementation)找到它的实现

@Override
@Transactional
public void importGenTable(List<GenTable> tableList)
{
    //获取用户名
    String operName = SecurityUtils.getUsername();
    try
    {
        for (GenTable table : tableList)//遍历
        {
            //获得表名
            String tableName = table.getTableName();
            //初始化,都是一些表格属性的配置,如表名、包名等等
            GenUtils.initTable(table, operName);
            //入库
            int row = genTableMapper.insertGenTable(table);
            if (row > 0)
            {
                // 查询和保存列信息,要加入事务中
                List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColu
                for (GenTableColumn column : genTableColumns)
                {
                    //初始化列属性字段
                    GenUtils.initColumnField(column, table);
                    genTableColumnMapper.insertGenTableColumn(column);
                }
            }
        }
    }
    catch (Exception e)
    {
        throw new CustomException("导入失败:" + e.getMessage());
    }

1.2.4 代码生成

我们在前端的 index的 handleGenTabl() 生成代码操作,这里就是负责代码生成部分的,其中 downLoadZip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi"); ,是导入了下载zip的组件来调用批量生成代码的方法 batchGenCode,我们进入后端,找到生成代码部分的 download() 方法

@PreAuthorize("@ss.hasPermi('tool:gen:code')")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/download/{tableName}")
public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
{
    //生成代码
    byte[] data = genTableService.downloadCode(tableName);
    //生成zip文件
    genCode(response, data);
}
posted @ 2020-12-03 09:50  刘条条  阅读(552)  评论(0编辑  收藏  举报