shikeying
2024-02-23 1d6e7763f4a30272cc0818ea12f83697b7375c45
iplatform-base-admin/src/main/java/com/iplatform/base/controller/GenController.java
@@ -1,14 +1,22 @@
package com.iplatform.base.controller;
import com.iplatform.base.SystemController;
import com.iplatform.core.util.CharsetKit;
import com.iplatform.core.util.Convert;
import com.iplatform.mybatis.domain.GenTable;
import com.iplatform.mybatis.domain.GenTableColumn;
import com.iplatform.mybatis.domain.TableDataInfo;
import com.iplatform.mybatis.service.IGenTableColumnService;
import com.iplatform.mybatis.service.IGenTableService;
import com.iplatform.mybatis.service.MetaDataServiceImpl;
import com.iplatform.mybatis.util.VelocityInitializer;
import com.iplatform.mybatis.util.VelocityUtils;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.web.ResponseValue;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
@@ -22,10 +30,14 @@
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * 代码生成 操作处理。
@@ -48,6 +60,9 @@
    @Autowired
    private IGenTableColumnService genTableColumnService;
    @Autowired
    private MetaDataServiceImpl metaDataService;
    /**
     * 查询代码生成列表
@@ -233,4 +248,51 @@
        rspData.setTotal(0);
        return rspData;
    }
    /**
     * 生成指定表结构代码,支持多数据库。
     * @param response
     * @param tableName 表名,可以是精确的表名,如:s_ment,也可以是前缀,如:s_
     * @param isPrecision 是否精确查询(单表)
     * @param packageName
     * @throws IOException
     * @date 2024-02-20
     */
    @GetMapping("/batchDownloadGenCode")
    public void batchDownloadGenCode(HttpServletResponse response, String tableName, boolean isPrecision, String packageName) throws IOException{
        List<GenTable> list = this.metaDataService.queryDatabaseTableInfo(tableName, isPrecision, packageName, null, null, null);
        if(StringUtils.isEmptyList(list)){
            logger.error("未查找到任何表信息,无法生存代码,tableName={}", tableName);
            return;
        }
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);
        for(GenTable table : list){
            VelocityInitializer.initVelocity();
            VelocityContext context = VelocityUtils.prepareContext(table);
            // 获取模板列表
            List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
            for (String template : templates) {
                // 渲染模板
                StringWriter sw = new StringWriter();
                Template tpl = Velocity.getTemplate(template, CharsetKit.UTF_8);
                tpl.merge(context, sw);
                try {
                    // 添加到zip
                    zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
                    IOUtils.write(sw.toString(), zip, CharsetKit.UTF_8);
                    IOUtils.closeQuietly(sw);
                    zip.flush();
                    zip.closeEntry();
                }
                catch (IOException e) {
                    logger.error("渲染模板失败,表名:" + table.getTableName(), e);
                }
            }
        }
        IOUtils.closeQuietly(zip);
        byte[] data = outputStream.toByteArray();
        genCode(response, data);
    }
}