package com.walker.jdbc.generator.util; import com.walker.jdbc.generator.Constants; import com.walker.jdbc.generator.GenerateException; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.WordUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class GenUtils { public static List getTemplates(String mbbs){ List templates = new ArrayList(); if(Constants.vm_type_tree_list.equalsIgnoreCase(mbbs)){//树形列表 //类 templates.add("treelisttemplate/Controller.vm"); templates.add("treelisttemplate/Service.vm"); templates.add("treelisttemplate/ServiceImpl.vm"); //页面 templates.add("treelisttemplate/Index.vm"); templates.add("treelisttemplate/Edit.vm"); templates.add("treelisttemplate/Sort.vm"); templates.add("treelisttemplate/Validate.vm"); }else if(Constants.vm_type_list.equalsIgnoreCase(mbbs)){//单表增删查改 //类 templates.add("dbzscgtemplate/Controller.vm"); templates.add("dbzscgtemplate/Service.vm"); templates.add("dbzscgtemplate/ServiceImpl.vm"); //页面 templates.add("dbzscgtemplate/Index.vm"); templates.add("dbzscgtemplate/Edit.vm"); templates.add("dbzscgtemplate/Show.vm"); templates.add("dbzscgtemplate/Sort.vm"); templates.add("dbzscgtemplate/Validate.vm"); }else if(Constants.vm_type_list_child.equalsIgnoreCase(mbbs)){//主子列表 //类 templates.add("paternitytemplate/Controller.vm"); templates.add("paternitytemplate/Service.vm"); templates.add("paternitytemplate/ServiceImpl.vm"); //页面 templates.add("paternitytemplate/Index.vm"); templates.add("paternitytemplate/Edit.vm"); templates.add("paternitytemplate/Show.vm"); templates.add("paternitytemplate/Sort.vm"); templates.add("paternitytemplate/Validate.vm"); templates.add("paternitytemplate/ValidateAll.vm"); }else if(Constants.vm_type_single_edit.equalsIgnoreCase(mbbs)){//单表动态行 //类 templates.add("dbdthtemplate/Controller.vm"); templates.add("dbdthtemplate/Service.vm"); templates.add("dbdthtemplate/ServiceImpl.vm"); //页面 templates.add("dbdthtemplate/Index.vm"); templates.add("dbdthtemplate/Sort.vm"); templates.add("dbdthtemplate/Validate.vm"); }else if(Constants.vm_type_treeform.equalsIgnoreCase(mbbs)){//树+表单 //类 templates.add("treeformtemplate/Controller.vm"); templates.add("treeformtemplate/Service.vm"); templates.add("treeformtemplate/ServiceImpl.vm"); //页面 templates.add("treeformtemplate/Index.vm"); templates.add("treeformtemplate/Edit.vm"); templates.add("treeformtemplate/Show.vm"); templates.add("treeformtemplate/Sort.vm"); templates.add("treeformtemplate/Validate.vm"); }else if(Constants.vm_type_publicpage.equalsIgnoreCase(mbbs)){//公共多选页面 //类 templates.add("publicpagetemplate/Controller.vm"); templates.add("publicpagetemplate/Service.vm"); templates.add("publicpagetemplate/ServiceImpl.vm"); //页面 templates.add("publicpagetemplate/Index.vm"); }else if(Constants.vm_type_anzscg.equalsIgnoreCase(mbbs)){//按钮增删查改 //类 templates.add("anzscgtemplate/Controller.vm"); templates.add("anzscgtemplate/Service.vm"); templates.add("anzscgtemplate/ServiceImpl.vm"); //页面 templates.add("anzscgtemplate/Index.vm"); templates.add("anzscgtemplate/Edit.vm"); templates.add("anzscgtemplate/Validate.vm"); }else if(Constants.vm_type_slbjck.equalsIgnoreCase(mbbs)){//双列编辑查看 //类 templates.add("slbjcktemplate/Controller.vm"); templates.add("slbjcktemplate/Service.vm"); templates.add("slbjcktemplate/ServiceImpl.vm"); //页面 templates.add("slbjcktemplate/Index.vm"); templates.add("slbjcktemplate/Edit.vm"); templates.add("slbjcktemplate/Show.vm"); templates.add("slbjcktemplate/Validate.vm"); } return templates; } /** * 获取基础路径包名称 * @param tableEntity * @param split * @return */ public static String getBaseName(Map tableEntity,String split) { String packagePath=""; if(StringUtils.isNotEmpty(tableEntity.get("module_name"))){ packagePath += tableEntity.get("module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("sub_module_name"))){ packagePath += split +tableEntity.get("sub_module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("function_name"))){ packagePath += split +tableEntity.get("function_name"); } return packagePath; } public static String getBaseZxtName(Map tableEntity,String split) { String packagePath=""; if(StringUtils.isNotEmpty(tableEntity.get("zxtbs"))){ packagePath += tableEntity.get("zxtbs"); } if(StringUtils.isNotEmpty(tableEntity.get("module_name"))){ packagePath += split + tableEntity.get("module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("sub_module_name"))){ packagePath += split +tableEntity.get("sub_module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("function_name"))){ packagePath += split +tableEntity.get("function_name"); } return packagePath; } /** * 获取文件名 */ public static String getFileName(String template,Map tableEntity) { String className=tableEntity.get("class_name").toString(); //String codeName=tableEntity.get("code_name"); String className_u=GenUtils.toUpperFirst(className); //基础存放路径 String htmlPath="main" + File.separator + "resources" + File.separator + "views"; String packagePath = "main" + File.separator + "java"; String jsPath="main" + File.separator + "resources" + File.separator + "static"+ File.separator + "js"; if (StringUtils.isNotEmpty(tableEntity.get("package_name").toString())) { packagePath += File.separator + tableEntity.get("package_name").toString().replace(".", File.separator); } if(StringUtils.isNotEmpty(tableEntity.get("zxtbs").toString())){ packagePath += File.separator +tableEntity.get("zxtbs")+File.separator+"model"; htmlPath += File.separator +tableEntity.get("zxtbs"); jsPath += File.separator +tableEntity.get("zxtbs"); } if(StringUtils.isNotEmpty(tableEntity.get("module_name").toString())){ packagePath += File.separator +tableEntity.get("module_name"); htmlPath += File.separator +tableEntity.get("module_name"); jsPath += File.separator +tableEntity.get("module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("sub_module_name").toString())){ packagePath += File.separator +tableEntity.get("sub_module_name"); htmlPath += File.separator +tableEntity.get("sub_module_name"); jsPath += File.separator +tableEntity.get("sub_module_name"); } if(StringUtils.isNotEmpty(tableEntity.get("function_name").toString())){ packagePath += File.separator +tableEntity.get("function_name"); htmlPath += File.separator +tableEntity.get("function_name"); jsPath += File.separator +tableEntity.get("function_name"); } String [] ts=template.split("/"); String template_type=ts[0]; String template_name=ts[1]; //树 if(Constants.vm_type_tree_list.equalsIgnoreCase(template_type)){ if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Sort.vm" )) { return htmlPath+ File.separator + className + "sort.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } }else if(Constants.vm_type_list.equalsIgnoreCase(template_type)){//单表增删查改 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Sort.vm" )) { return htmlPath+ File.separator + className + "sort.ftl"; } if (template_name.equals("Show.vm" )) { return htmlPath+ File.separator + className + "show.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } }else if(Constants.vm_type_list_child.equalsIgnoreCase(template_type)){//主子表 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Sort.vm" )) { return htmlPath+ File.separator + className + "sort.ftl"; } if (template_name.equals("Show.vm" )) { return htmlPath+ File.separator + className + "show.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } if (template_name.equals("ValidateAll.vm" )) { return jsPath + File.separator + className + "validateAll.js"; } }else if(Constants.vm_type_single_edit.equalsIgnoreCase(template_type)){//单表动态行 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } if (template_name.equals("Sort.vm" )) { return htmlPath+ File.separator + className + "sort.ftl"; } }else if(Constants.vm_type_treeform.equalsIgnoreCase(template_type)){//树+表单 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Sort.vm" )) { return htmlPath+ File.separator + className + "sort.ftl"; } if (template_name.equals("Show.vm" )) { return htmlPath+ File.separator + className + "show.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } }else if(Constants.vm_type_publicpage.equalsIgnoreCase(template_type)){//公共多选页面 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } }else if(Constants.vm_type_anzscg.equalsIgnoreCase(template_type)){//按钮增删查改 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } }else if(Constants.vm_type_slbjck.equalsIgnoreCase(template_type)){//双列编辑查看 if (template_name.equals("Controller.vm" )) { return packagePath + File.separator + className_u + "Controller.java"; } if (template_name.equals("Service.vm" )) { return packagePath + File.separator + className_u + "Service.java"; } if (template_name.equals("ServiceImpl.vm" )) { return packagePath + File.separator + className_u + "ServiceImpl.java"; } if (template_name.equals("Index.vm" )) { return htmlPath+ File.separator + className+ "index.ftl"; } if (template_name.equals("Edit.vm" )) { return htmlPath+ File.separator + className + "edit.ftl"; } if (template_name.equals("Show.vm" )) { return htmlPath+ File.separator + className + "show.ftl"; } if (template_name.equals("Validate.vm" )) { return jsPath + File.separator + className + "validate.js"; } } return null; } /** * 生成代码 */ public static void generatorCode(Map tableEntity, List> columns, ZipOutputStream zip) { //设置velocity资源加载器 Properties prop = new Properties(); prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Velocity.init(prop); //配置信息 //封装模板数据 tableEntity.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); VelocityContext context = new VelocityContext(tableEntity); List> columns_r = new ArrayList<>(); List> columns_map = new ArrayList<>(); List> columns_cmap = new ArrayList<>(); List> columns_sql = new ArrayList<>(); List> columns_file = new ArrayList<>(); List> columns_auto = new ArrayList<>(); List> tableList = new ArrayList<>();//关联子表信息 Configuration config = GenUtils.getConfig(); String mb = tableEntity.get("tpl_category").toString(); //if (mb.equals(Constants.vm_type_tree_list) || mb.equals(Constants.vm_type_treeform) || mb.equals(Constants.vm_type_publicpage)) { String first_width = null; String last_width = null; String first_column_code = null; String sfgdcx = null; String firstCount = null; String secondCount = null; if (columns.size() > 0) { first_width = columns.get(columns.size() - 3).get("first_width")==null?"":columns.get(columns.size() - 3).get("first_width").toString(); last_width = columns.get(columns.size() - 3).get("last_width")==null?"":columns.get(columns.size() - 3).get("last_width").toString(); first_column_code = columns.get(columns.size() - 3).get("first_column_code")==null?"":columns.get(columns.size() - 3).get("first_column_code").toString(); sfgdcx = columns.get(columns.size() - 2).get("sfgdcx")==null?"":columns.get(columns.size() - 2).get("sfgdcx").toString(); firstCount = columns.get(columns.size() - 1).get("firstCount")==null?"":columns.get(columns.size() - 1).get("firstCount").toString(); secondCount = columns.get(columns.size() - 1).get("secondCount")==null?"":columns.get(columns.size() - 1).get("secondCount").toString(); } context.put("first_width", first_width); context.put("last_width", last_width); context.put("first_column_code", first_column_code); context.put("sfgdcx", sfgdcx); context.put("firstCount", Integer.valueOf(StringUtils.isEmpty(firstCount)?"0":firstCount)); context.put("secondCount", Integer.valueOf(StringUtils.isEmpty(secondCount)?"0":secondCount)); //} if(tableEntity.get("child_table") != null && tableEntity.get("child_table") != "" && tableEntity.get("child_column") != null && tableEntity.get("child_column") != ""){ String[] tablesinfo = tableEntity.get("child_table").toString().split(","); String[] columnsinfo = tableEntity.get("child_column").toString().split(","); if (tablesinfo != null && tablesinfo.length > 0 && columnsinfo != null && columnsinfo.length > 0) { for (int i=0;i table_map = new HashMap(); table_map.put("table_code", tablesinfo[i].toLowerCase()); table_map.put("table_code_u", GenUtils.toUpperFirst(tablesinfo[i].toLowerCase())); table_map.put("table_column", columnsinfo[j]); table_map.put("table_column_u", GenUtils.toUpperFirst(columnsinfo[j])); tableList.add(table_map); } } } } } //for (List> columns : columnlist) { for (Map tmap : columns) { if (tmap.get("column_code") != null && tmap.get("column_code") != "") { tmap.put("column_code_u", GenUtils.toUpperFirst(tmap.get("column_code").toString())); } tmap.put("list_type", "cmap"); if (tmap.get("list_data") != null) { String listdata = tmap.get("list_data").toString(); /*String[] t = listdata.split("5"); if (t.length > 1) { tmap.put("listdataval", t[1]); }*/ if (listdata.startsWith("map=")) { tmap.put("listdataval", listdata.substring(4)); tmap.put("list_type", "map"); //组织常量类get方法 String map = listdata.substring(4).split("\\.")[listdata.substring(4).split("\\.").length-1]; String lurl = listdata.substring(4).replace(map,""); String getMethod = lurl+"get"+map; tmap.put("getmethod", getMethod); if(tmap.get("column_type").equals("NVARCHAR2")||tmap.get("column_type").equals("varchar")){ tmap.put("convertlx", "Str"); }else if(tmap.get("column_type").equals("NUMBER")||tmap.get("column_type").equals("decimal")){ tmap.put("convertlx", "Int"); } columns_map.add(tmap); } else if (listdata.startsWith("cmap=")) { tmap.put("listdataval", listdata.substring(5)); tmap.put("list_type", "cmap"); //组织常量类get方法 String map = listdata.substring(5).split("\\.")[listdata.substring(5).split("\\.").length-1]; String lurl = listdata.substring(5).replace(map,""); String getMethod = lurl+"get"+map; tmap.put("getmethod", getMethod); if(tmap.get("column_type").equals("NVARCHAR2")||tmap.get("column_type").equals("varchar")){ tmap.put("convertlx", "Str"); }else if(tmap.get("column_type").equals("NUMBER")||tmap.get("column_type").equals("decimal")){ tmap.put("convertlx", "Int"); } columns_cmap.add(tmap); } else if (listdata.startsWith("sql=")) { tmap.put("listdataval", listdata.substring(4)); tmap.put("list_type", "sql"); //组织常量类get方法 String map = listdata.substring(4).split("\\.")[listdata.substring(4).split("\\.").length-1]; String lurl = listdata.substring(4).replace(map,""); String getMethod = lurl+"get"+map; tmap.put("getmethod", getMethod); if(tmap.get("column_type").equals("NVARCHAR2")||tmap.get("column_type").equals("varchar")){ tmap.put("convertlx", "Str"); }else if(tmap.get("column_type").equals("NUMBER")||tmap.get("column_type").equals("decimal")){ tmap.put("convertlx", "Int"); } columns_sql.add(tmap); } else if (listdata.startsWith("max_file_size=")) { tmap.put("list_type", "file"); columns_file.add(tmap); } } if (tmap.get("insert_type") != null) { String insert_type = tmap.get("insert_type").toString(); if (insert_type.equals("insert_type_sxh")) { tmap.put("insert_type", "insert_type_sxh"); } else { tmap.put("insert_type", config.getString(insert_type + "_val")); } columns_auto.add(tmap); } columns_r.add(tmap); //判断是否有人员或机构 if (tmap.get("show_type") != null && (tmap.get("show_type").equals("show_type_ry") || tmap.get("show_type").equals("show_type_jg"))) { context.put("isryjg", true); } } //} context.put("columns",columns_r); context.put("columns_auto",columns_auto); context.put("columns_map",columns_map); context.put("columns_cmap",columns_cmap); context.put("columns_sql",columns_sql); context.put("columns_file",columns_file); context.put("tableList",tableList); //获取模板列表 List templates = getTemplates(tableEntity.get("tpl_category").toString()); try { for(String template : templates){ //渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, "UTF-8"); tpl.merge(context, sw); //添加到zip zip.putNextEntry(new ZipEntry(getFileName(template,tableEntity))); IOUtils.write(sw.toString(), zip, "UTF-8"); IOUtils.closeQuietly(sw); } } catch (IOException e) { throw new GenerateException("渲染模板失败,表名:" + tableEntity.get("table_name"), e); } } /** * 列名转换成Java属性名 */ public static String columnToJava(String columnName) { return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", ""); } /** * 表名转换成Java类名 */ public static String tableToJava(String tableName, String tablePrefix) { if(StringUtils.isNotEmpty(tablePrefix)){ String className = tableName.split(tablePrefix)[1]; return columnToJava(className); }else{ return columnToJava(tableName); } } /** * 获取配置信息 */ public static Configuration getConfig(){ try { return new PropertiesConfiguration("generator.properties"); } catch (ConfigurationException e) { throw new GenerateException("获取配置文件失败:generator.properties", e); } } //首字母转大写 public static String toUpperFirst(String s){ if(Character.isUpperCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString(); } //转换map 统一新增首字母大写内容 public static Map tranMap(Map tmap){ Map rmap=new HashMap<>(); for (Map.Entry entry : tmap.entrySet()) { if(entry.getValue()==null){ rmap.put(entry.getKey(),""); rmap.put(entry.getKey()+"_u",""); }else{ rmap.put(entry.getKey(),entry.getValue().toString().toLowerCase()); rmap.put(entry.getKey()+"_u",GenUtils.toUpperFirst(entry.getValue().toString().toLowerCase())); } } return rmap; } public static LinkedHashMap configToMap(String config_type) { //配置信息 Configuration prop = GenUtils.getConfig(); List keys=prop.getList(config_type); LinkedHashMap resultMap=new LinkedHashMap<>(); for(Object key:keys){ resultMap.put(key.toString(),prop.getString(key.toString())); } return resultMap; } }