package cc.mrbird.febs.generator.controller; import cc.mrbird.febs.common.annotation.ControllerEndpoint; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.common.utils.FileUtil; import cc.mrbird.febs.generator.entity.Column; import cc.mrbird.febs.generator.entity.GeneratorConfig; import cc.mrbird.febs.generator.entity.GeneratorConstant; import cc.mrbird.febs.generator.helper.GeneratorHelper; import cc.mrbird.febs.generator.service.IGeneratorConfigService; import cc.mrbird.febs.generator.service.IGeneratorService; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @author MrBird */ @Slf4j @RestController @RequestMapping("generator") @RequiredArgsConstructor public class GeneratorController extends BaseController { private static final String SUFFIX = "_code.zip"; private final IGeneratorService generatorService; private final IGeneratorConfigService generatorConfigService; private final GeneratorHelper generatorHelper; private final DynamicDataSourceProperties properties; @GetMapping("datasource") @RequiresPermissions("generator:view") public FebsResponse datasource() { Map datasources = properties.getDatasource(); List datasourcesName = new ArrayList<>(); datasources.forEach((k, v) -> { String datasourceName = StringUtils.substringBefore(StringUtils.substringAfterLast(v.getUrl(), "/"), "?"); datasourcesName.add(datasourceName); }); return new FebsResponse().success().data(datasourcesName); } @GetMapping("tables/info") @RequiresPermissions("generator:view") public FebsResponse tablesInfo(String tableName, String datasource, QueryRequest request) { Map dataTable = getDataTable(generatorService.getTables(tableName, request, GeneratorConstant.DATABASE_TYPE, datasource)); return new FebsResponse().success().data(dataTable); } @GetMapping @RequiresPermissions("generator:generate") @ControllerEndpoint(exceptionMessage = "代码生成失败") public void generate(@NotBlank(message = "{required}") String name, String remark, String datasource, HttpServletResponse response) throws Exception { GeneratorConfig generatorConfig = generatorConfigService.findGeneratorConfig(); if (generatorConfig == null) { throw new FebsException("代码生成配置为空"); } String className = name; if (GeneratorConfig.TRIM_YES.equals(generatorConfig.getIsTrim())) { className = RegExUtils.replaceFirst(name, generatorConfig.getTrimValue(), StringUtils.EMPTY); } generatorConfig.setTableName(name); generatorConfig.setClassName(FebsUtil.underscoreToCamel(className)); generatorConfig.setTableComment(remark); // 生成代码到临时目录 List columns = generatorService.getColumns(GeneratorConstant.DATABASE_TYPE, datasource, name); generatorHelper.generateEntityFile(columns, generatorConfig); generatorHelper.generateMapperFile(columns, generatorConfig); generatorHelper.generateMapperXmlFile(columns, generatorConfig); generatorHelper.generateServiceFile(columns, generatorConfig); generatorHelper.generateServiceImplFile(columns, generatorConfig); generatorHelper.generateControllerFile(columns, generatorConfig); // 打包 String zipFile = System.currentTimeMillis() + SUFFIX; FileUtil.compress(GeneratorConstant.TEMP_PATH + "src", zipFile); // 下载 FileUtil.download(zipFile, name + SUFFIX, true, response); // 删除临时目录 FileUtil.delete(GeneratorConstant.TEMP_PATH); } }