From 253441942f8eddf600bfcd25c95a9b1887279a20 Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Thu, 16 Jun 2022 15:05:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90-=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hxkj/admin/config/AdminConfig.java | 3 +- server/like-common/pom.xml | 5 ++ .../com/hxkj/common/utils/StringUtil.java | 61 +++++++++++++++++++ .../generator/controller/GenController.java | 20 +++++- .../hxkj/generator/mapper/GenTableMapper.java | 12 ---- .../generator/service/IGenerateService.java | 11 +++- .../service/impl/GenerateServiceImpl.java | 58 ++++++++++++++++-- .../com/hxkj/generator/util/VelocityUtil.java | 51 ++++++++++++++-- server/pom.xml | 7 +++ 9 files changed, 201 insertions(+), 27 deletions(-) diff --git a/server/like-admin/src/main/java/com/hxkj/admin/config/AdminConfig.java b/server/like-admin/src/main/java/com/hxkj/admin/config/AdminConfig.java index a3d19d33..77ece1e3 100644 --- a/server/like-admin/src/main/java/com/hxkj/admin/config/AdminConfig.java +++ b/server/like-admin/src/main/java/com/hxkj/admin/config/AdminConfig.java @@ -17,7 +17,8 @@ public class AdminConfig { // 免登录验证 public static String[] notLoginUri = new String[]{ "system:login", // 登录接口 - "index:config" // 配置接口 + "index:config", // 配置接口 + "gen:genCode" }; // 免权限验证 diff --git a/server/like-common/pom.xml b/server/like-common/pom.xml index 225d9331..b8aa78f7 100644 --- a/server/like-common/pom.xml +++ b/server/like-common/pom.xml @@ -108,6 +108,11 @@ nl.bitwalker UserAgentUtils + + + commons-io + commons-io + com.qiniu diff --git a/server/like-common/src/main/java/com/hxkj/common/utils/StringUtil.java b/server/like-common/src/main/java/com/hxkj/common/utils/StringUtil.java index 4e702aca..3009ea76 100644 --- a/server/like-common/src/main/java/com/hxkj/common/utils/StringUtil.java +++ b/server/like-common/src/main/java/com/hxkj/common/utils/StringUtil.java @@ -474,4 +474,65 @@ public class StringUtil extends org.apache.commons.lang3.StringUtils { return sb.toString(); } + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 文本模板,被替换的部分用 {} 表示 + * @param argArray 参数值 + * @return 格式化后的文本 + */ + public static String format(String strPattern, Object... argArray) { + String EMPTY_JSON = "{}"; + char C_BACKSLASH = '\\'; + char C_DELIM_START = '{'; + + if (isEmpty(argArray) || isEmpty(strPattern)) { + return strPattern; + } + + final int strPatternLength = strPattern.length(); + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + int handledPosition = 0; + int delimIndex; + for (int argIndex = 0; argIndex < argArray.length; argIndex++) { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) { + if (handledPosition == 0) { + return strPattern; + } else { + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } else { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(argArray[argIndex]); + handledPosition = delimIndex + 2; + } else { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } else { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(argArray[argIndex]); + handledPosition = delimIndex + 2; + } + } + } + + sbuf.append(strPattern, handledPosition, strPattern.length()); + return sbuf.toString(); + } + } diff --git a/server/like-generator/src/main/java/com/hxkj/generator/controller/GenController.java b/server/like-generator/src/main/java/com/hxkj/generator/controller/GenController.java index 815698ed..92837e85 100644 --- a/server/like-generator/src/main/java/com/hxkj/generator/controller/GenController.java +++ b/server/like-generator/src/main/java/com/hxkj/generator/controller/GenController.java @@ -9,11 +9,16 @@ import com.hxkj.generator.validate.GenParam; import com.hxkj.generator.validate.PageParam; import com.hxkj.generator.vo.DbTableVo; import com.hxkj.generator.vo.GenTableVo; +import org.apache.commons.io.IOUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Map; +import java.util.zip.ZipOutputStream; @RestController @RequestMapping("/api/gen") @@ -130,8 +135,19 @@ public class GenController { * @author fzr * @return Object */ - @GetMapping("genCode") - public Object genCode(@Validated @IDMust() @RequestParam("id") Integer id) { + @GetMapping("/genCode") + public Object genCode(HttpServletResponse response, String tables) throws IOException { + String[] tableNames = tables.split(","); + + byte[] data = iGenerateService.downloadCode(tableNames); + + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); return null; } diff --git a/server/like-generator/src/main/java/com/hxkj/generator/mapper/GenTableMapper.java b/server/like-generator/src/main/java/com/hxkj/generator/mapper/GenTableMapper.java index 52f6a924..c891e938 100644 --- a/server/like-generator/src/main/java/com/hxkj/generator/mapper/GenTableMapper.java +++ b/server/like-generator/src/main/java/com/hxkj/generator/mapper/GenTableMapper.java @@ -73,16 +73,4 @@ public interface GenTableMapper extends IBaseMapper { ""}) List selectDbTableColumnsByName(String tableName); - @Select({""}) - Map selectGenTableByName(Integer id); - } diff --git a/server/like-generator/src/main/java/com/hxkj/generator/service/IGenerateService.java b/server/like-generator/src/main/java/com/hxkj/generator/service/IGenerateService.java index 7c049ca1..87e5eb4c 100644 --- a/server/like-generator/src/main/java/com/hxkj/generator/service/IGenerateService.java +++ b/server/like-generator/src/main/java/com/hxkj/generator/service/IGenerateService.java @@ -27,6 +27,8 @@ public interface IGenerateService { * 生成列表 * * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 * @return Object */ PageResult list(PageParam pageParam, Map params); @@ -35,6 +37,7 @@ public interface IGenerateService { * 生成详情 * * @author fzr + * @param id 主键 * @return Object */ Map detail(Integer id); @@ -50,6 +53,7 @@ public interface IGenerateService { /** * 编辑表结构 * + * @param genParam 参数 * @author fzr */ void editTable(GenParam genParam); @@ -57,6 +61,7 @@ public interface IGenerateService { /** * 删除表结构 * + * @param id 主键 * @author fzr */ void deleteTable(Integer id); @@ -64,6 +69,7 @@ public interface IGenerateService { /** * 同步数据表 * + * @param id 主键 * @author fzr */ void syncTable(Integer id); @@ -77,11 +83,12 @@ public interface IGenerateService { Map previewCode(Integer id); /** - * 生成代码 + * 下载代码 * * @author fzr + * @param tableNames 表名集合 * @return Object */ - Object genCode(Integer id); + byte[] downloadCode(String[] tableNames); } diff --git a/server/like-generator/src/main/java/com/hxkj/generator/service/impl/GenerateServiceImpl.java b/server/like-generator/src/main/java/com/hxkj/generator/service/impl/GenerateServiceImpl.java index e43ab672..5451145c 100644 --- a/server/like-generator/src/main/java/com/hxkj/generator/service/impl/GenerateServiceImpl.java +++ b/server/like-generator/src/main/java/com/hxkj/generator/service/impl/GenerateServiceImpl.java @@ -22,18 +22,25 @@ import com.hxkj.generator.validate.PageParam; import com.hxkj.generator.vo.DbTableVo; import com.hxkj.generator.vo.GenColumnVo; import com.hxkj.generator.vo.GenTableVo; +import org.apache.commons.io.IOUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.StringWriter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 代码生成器服务实现类 @@ -41,6 +48,8 @@ import java.util.stream.Collectors; @Service public class GenerateServiceImpl implements IGenerateService { + private static final Logger log = LoggerFactory.getLogger(GenerateServiceImpl.class); + @Resource GenTableMapper genTableMapper; @@ -348,15 +357,54 @@ public class GenerateServiceImpl implements IGenerateService { return map; } + @Override + public byte[] downloadCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + genZipCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + /** * 生成代码 * - * @author fzr - * @return Object + * @param tableName 表名 + * @param zip 压缩包 */ - @Override - public Object genCode(Integer id) { - return null; + public void genZipCode(String tableName, ZipOutputStream zip) { + // 查表信息 + GenTable table = genTableMapper.selectOne(new QueryWrapper() + .eq("table_name", tableName) + .last("limit 1")); + + // 查列信息 + List columns = genTableColumnMapper.selectList( + new QueryWrapper() + .orderByAsc("sort") + .eq("table_id", table.getId())); + + // 初始模板 + VelocityUtil.initVelocity(); + VelocityContext context = VelocityUtil.prepareContext(table, columns); + + // 渲染模板 + List templates = VelocityUtil.getTemplateList(table.getGenTpl()); + for (String template : templates) { + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, "UTF-8"); + tpl.merge(context, sw); + try { + zip.putNextEntry(new ZipEntry(VelocityUtil.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, "UTF-8"); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("生成渲染模板失败: " + e.getMessage()); + } + } } } diff --git a/server/like-generator/src/main/java/com/hxkj/generator/util/VelocityUtil.java b/server/like-generator/src/main/java/com/hxkj/generator/util/VelocityUtil.java index 57a1ac28..5d09d031 100644 --- a/server/like-generator/src/main/java/com/hxkj/generator/util/VelocityUtil.java +++ b/server/like-generator/src/main/java/com/hxkj/generator/util/VelocityUtil.java @@ -59,13 +59,54 @@ public class VelocityUtil { */ public static List getTemplateList(String genTpl) { List templates = new LinkedList<>(); -// templates.add("java/controller.java.vm"); -// templates.add("java/entity.java.vm"); -// templates.add("java/mapper.java.vm"); -// templates.add("java/service.java.vm"); + templates.add("java/controller.java.vm"); + templates.add("java/entity.java.vm"); + templates.add("java/mapper.java.vm"); + templates.add("java/service.java.vm"); templates.add("java/serviceImpl.java.vm"); -// templates.add("java/validate.java.vm"); + templates.add("java/validate.java.vm"); return templates; } + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) + { + // 文件名称 + String fileName = ""; + String entityName = genTable.getEntityName(); + String moduleName = genTable.getModuleName(); + String packageName = genTable.getPackageName(); + String businessName = genTable.getBusinessName(); + + String javaPath = StringUtil.replace(packageName, ".", "/"); + + if (template.contains("mapper.java.vm")) { + fileName = StringUtil.format("{}/mapper/{}Mapper.java", "com/hxkj/common", entityName); + } + + else if (template.contains("entity.java.vm")) { + fileName = StringUtil.format("{}/entity/{}Entity.java", "com/hxkj/common", entityName); + } + + else if (template.contains("service.java.vm")) { + fileName = StringUtil.format("{}/service/I{}Service.java", javaPath, entityName); + } + + else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtil.format("{}/service/impl/{}ServiceImpl.java", javaPath, entityName); + } + + else if (template.contains("controller.java.vm")) { + fileName = StringUtil.format("{}/controller/{}Controller.java", javaPath, entityName); + } + + else if (template.contains("validate.java.vm")) { + fileName = StringUtil.format("{}/validate/{}Param.java", javaPath, entityName); + } + + return fileName; + } + } diff --git a/server/pom.xml b/server/pom.xml index aad7aa06..f4db6d83 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -35,6 +35,7 @@ 3.12.0 2.9.0 1.2.4 + 2.11.0 7.9.5 5.6.54 3.1.411 @@ -114,6 +115,12 @@ UserAgentUtils ${bitwalker.version}
+ + + commons-io + commons-io + ${commons.io.version} + com.qiniu