package com.fastbee.common.utils.generate;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;

import java.util.ArrayList;
import java.util.List;


/**
 * 代码生成器：根据数据库表结构，生成对应的实体类、Mapper接口、Service接口、Controller等基础代码，
 * @author 蒾酒
 */
public class CodeGenerator {
    public static void main(String[] args) {
        getCode();
    }

    public static void getCode() {
        //TODO 修改为自己的数据库信息
        String url = "jdbc:mysql://w.hanzhenyun.com:3306/wumei2.4?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        String username = "wumei2.4";
        String password = "rtB8EhbRRYSGyxHw";
        //TODO 修改为自己的表名
        List<String> tables = new ArrayList<>();//需要生成对应代码的表名的集合
        tables.add("g_groups");

        FastAutoGenerator.create(url, username, password)
                //全局配置----------------------------------------------------------------------------------------
                .globalConfig(builder -> {
                    builder
                            .author("蒾酒")//TODO 修改为自己名称
                            .outputDir(System.getProperty("user.dir") + "\\fastbee-service\\fastbee-project-service\\src\\main\\java")//生成文件输出基础路径(父模块路径)
                            // .enableSwagger() //开启swagger，会自动添加swagger相关注解
                            .commentDate("yyyy-MM-dd");//日期格式
                })

                //包名配置--------------------------------------------------------------------------------------------
                .packageConfig(builder ->
                    builder
                            .parent("com.fastbee.project")//TODO 修改为项目的具体业务模块
                            .entity("domain")//数据库实体类输出路径
                            .service("service")//业务接口输出路径
                            .serviceImpl("service.impl")//业务实现类输出路径
                            // .controller("controller")//控制器输出路径
                            .mapper("mapper")//映射文件输出路径
                            .xml("mapper/xml")//XML文件输出路径
                )
                //策略配置-----------------------------------------------------------------------------------------
                .strategyConfig(builder -> {
                    builder
                            .addInclude(tables)// 需要生成代码对应的表，若需要生成全部表则注释该行解放下一行
                            // .addInclude("all")//生成全部表
                            // .addTablePrefix("p_")//表前缀过滤，例如“p_”开头的表不会生成对应代码

                            //实体策略配置
                            .entityBuilder()
                            .enableFileOverride()// TODO 开启覆盖已生成的entity文件,关闭则注释本行
                            .enableLombok()// 自动添加lombok注解@Getter @Setter
                            .logicDeleteColumnName("deleted")// 指定逻辑删除字段名自动为其添加逻辑删除字段注解
                            .enableTableFieldAnnotation()//启用表字段注解@TableField

                            //Mapper策略配置
                            .mapperBuilder()
                            .enableBaseResultMap() // 生成通用的resultMap
                            .superClass(BaseMapper.class)
                            .formatMapperFileName("%sMapper")//mapper文件后缀,如UserMapper
                            // .enableFileOverride()// TODO 开启覆盖已生成的mapper文件(谨慎开启),关闭则注释本行
                            .formatXmlFileName("%sMapper")//xml文件后缀,如UserMapper.xml

                            //Service策略配置
                            .serviceBuilder()
                            // .enableFileOverride()//TODO 开启覆盖已生成的service文件(谨慎开启),关闭则注释本行
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")

                            //Controller策略配置
                            .controllerBuilder()
                            .enableHyphenStyle() // 映射路径使用连字符格式
                            .formatFileName("%sController")
                            // .enableFileOverride()// TODO 开启覆盖已生成的controller文件(谨慎开启),关闭则注释本行
                            .enableRestStyle();//启用rest风格自动添加@RestController
                })

                .execute();
    }


}
