package com.ibeetl.admin.core.web; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.beetl.core.Configuration; import org.beetl.core.GroupTemplate; import org.beetl.core.Template; import org.beetl.core.resource.ClasspathResourceLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.ibeetl.admin.core.gen.AutoGen; import com.ibeetl.admin.core.gen.HtmlGen; import com.ibeetl.admin.core.gen.JSGen; import com.ibeetl.admin.core.gen.JavaCodeGen; import com.ibeetl.admin.core.gen.MavenProjectTarget; import com.ibeetl.admin.core.gen.MdGen; import com.ibeetl.admin.core.gen.WebTarget; import com.ibeetl.admin.core.gen.model.Attribute; import com.ibeetl.admin.core.gen.model.Entity; import com.ibeetl.admin.core.service.CoreCodeGenService; import com.ibeetl.admin.core.util.PlatformException; @Controller public class CoreCodeGenController { private final Log log = LogFactory.getLog(this.getClass()); private static final String MODEL = "/core/codeGen"; @Autowired CoreCodeGenService codeGenService; @GetMapping(MODEL + "/index.do") public ModelAndView index() { ModelAndView view = new ModelAndView("/core/codeGen/index.html"); return view; } @PostMapping(MODEL + "/refresh.json") @ResponseBody public JsonResult refresh() { codeGenService.refresh(); return JsonResult.success(); } @GetMapping(MODEL + "/tableDetail.do") public ModelAndView tableDetail(String table) { ModelAndView view = new ModelAndView("/core/codeGen/edit.html"); Entity entity = codeGenService.getEntityInfo(table); view.addObject("entity", entity); return view; } @GetMapping(MODEL + "/project.do") public ModelAndView project() { ModelAndView view = new ModelAndView("/core/codeGen/project.html"); File file = new File(MavenProjectTarget.detectRootPath()); String root = file.getParent(); //设置生成项目为当前运行项目的上一级项目 view.addObject("path",root+File.separator+"sample"); view.addObject("basePackage","com.corp.xxx"); return view; } @PostMapping(MODEL + "/projectGen.json") @ResponseBody public JsonResult project(String path,String basePackage,String includeConsole) throws IOException { //includeConsole 当前版本忽略,总是添加一个系统管理功能,可以在pom中移除console //生成maven项目结构 File maven = new File(path); maven.mkdirs(); File src = new File(maven,"src"); src.mkdirs(); File main = new File(src,"main"); main.mkdir(); File test = new File(src,"test"); test.mkdir(); File javsSource = new File(main,"java"); javsSource.mkdir(); File resource = new File(main,"resources"); resource.mkdir(); File sql = new File(resource,"sql"); sql.mkdir(); File staticFile = new File(resource,"static"); staticFile.mkdir(); File templatesFile = new File(resource,"templates"); templatesFile.mkdir(); String codePath = basePackage.replace(".", "/"); File codeFile = new File(javsSource,codePath); codeFile.mkdirs(); Configuration conf = Configuration.defaultConfiguration(); String tempalteRoot = "codeTemplate/maven/"; ClasspathResourceLoader loader = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader(),tempalteRoot); GroupTemplate gt = new GroupTemplate(loader,conf); FileWriter fw = null; //先生成入口程序 Template mainJavaTempalte = gt.getTemplate("/main.java"); mainJavaTempalte.binding("basePackage", basePackage); fw = new FileWriter(new File(codeFile,"MainApplication.java")); mainJavaTempalte.renderTo(fw); //生成pom文件 Template pomTemplate = gt.getTemplate("/pomTemplate.xml"); int index = basePackage.lastIndexOf("."); String projectGrop = basePackage.substring(0, index); String projectName = basePackage.substring(index+1); pomTemplate.binding("group", projectGrop); pomTemplate.binding("project", projectName); fw = new FileWriter(new File(maven,"pom.xml")); pomTemplate.renderTo(fw); //复制当前项目的配置文件 File config = copy(resource,"application.properties"); copy(resource,"beetl.properties"); copy(resource,"btsql-ext.properties"); copy(resource,"banner.txt"); return JsonResult.success(); } private File copy(File root,String fileName) throws IOException { ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream input = loader.getResourceAsStream(fileName); if(input==null) { log.info("copy "+fileName+" error,不存在"); return null; } File target = new File(root,fileName); FileOutputStream output = new FileOutputStream(target); try { byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buf)) > 0) { output.write(buf, 0, bytesRead); } } finally { input.close(); output.close(); } return target; } @PostMapping(MODEL + "/table.json") @ResponseBody public JsonResult> getTable() { List list = codeGenService.getAllEntityInfo(); return JsonResult.success(list); } @PostMapping(MODEL + "/tableDetail.json") @ResponseBody public JsonResult getInfo(String table) { Entity entity = codeGenService.getEntityInfo(table); if (entity == null) { JsonResult.failMessage("表不存在"); } return JsonResult.success(entity); } @PostMapping(MODEL + "/gen.json") @ResponseBody public JsonResult gen(EntityInfo data,String path) { Entity entity = getEntitiyInfo(data); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); MavenProjectTarget target = new MavenProjectTarget(entity, basePackage); //生成到path目录下,按照maven工程解构生成 File file = new File(path); if(!file.exists()) { throw new PlatformException("路径不存在 "+path); } target.setTargetPath(path); target.setUrlBase(urlBase); JSGen jsGen = new JSGen(); jsGen.make(target, entity); HtmlGen htmlGen = new HtmlGen(); htmlGen.make(target, entity); String preffix = urlBase.replace('/', '.'); String basicFunctionCode = preffix+"."+entity.getCode(); JavaCodeGen javaGen = new JavaCodeGen(basePackage, entity,basicFunctionCode); javaGen.make(target, entity); MdGen mdGen = new MdGen(); mdGen.make(target, entity); if(entity.isAutoAddMenu()||entity.isAutoAddFunction()) { //自动增加功能点 long functionId = this.codeGenService.insertFunction(entity, urlBase); if(entity.isAutoAddMenu()) { this.codeGenService.insertMenu(functionId, entity, urlBase); } } return JsonResult.success(); } @PostMapping(MODEL + "/getPath.json") @ResponseBody public JsonResult getPath() { String path = MavenProjectTarget.detectRootPath(); return JsonResult.success(path); } @PostMapping(MODEL + "/html.json") @ResponseBody public JsonResult> html(EntityInfo data) { Entity entity = getEntitiyInfo(data); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); WebTarget webTarget = new WebTarget(entity, basePackage); webTarget.setUrlBase(urlBase); HtmlGen htmlGen = new HtmlGen(); htmlGen.make(webTarget, entity); Map content = new HashMap(); for (Entry entry : webTarget.map.entrySet()) { AutoGen gen = (AutoGen) entry.getKey(); String code = entry.getValue(); content.put(gen.getName(), code); } return JsonResult.success(content); } @PostMapping(MODEL + "/js.json") @ResponseBody public JsonResult> js(EntityInfo data) { Entity entity = getEntitiyInfo(data); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); WebTarget webTarget = new WebTarget(entity, basePackage); webTarget.setUrlBase(urlBase); JSGen jsGen = new JSGen(); jsGen.make(webTarget, entity); Map content = new HashMap(); for (Entry entry : webTarget.map.entrySet()) { AutoGen gen = (AutoGen) entry.getKey(); String code = entry.getValue(); content.put(gen.getName(), code); } return JsonResult.success(content); } @PostMapping(MODEL + "/java.json") @ResponseBody public JsonResult> javaCode(EntityInfo data) { Entity entity = getEntitiyInfo(data); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); WebTarget webTarget = new WebTarget(entity, basePackage); webTarget.setUrlBase(urlBase); String preffix = urlBase.replace('/', '.'); String basicFunctionCode = preffix+"."+entity.getCode(); JavaCodeGen javaGen = new JavaCodeGen(basePackage,entity,basicFunctionCode); javaGen.make(webTarget, entity); Map content = new HashMap(); for (Entry entry : webTarget.map.entrySet()) { AutoGen gen = (AutoGen) entry.getKey(); String code = entry.getValue(); content.put(gen.getName(), code); } return JsonResult.success(content); } @PostMapping(MODEL + "/sql.json") @ResponseBody public JsonResult> sql(EntityInfo data) { Entity entity = getEntitiyInfo(data); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); WebTarget webTarget = new WebTarget(entity, basePackage); webTarget.setUrlBase(urlBase); MdGen javaGen = new MdGen(); javaGen.make(webTarget, entity); Map content = new HashMap(); for (Entry entry : webTarget.map.entrySet()) { AutoGen gen = (AutoGen) entry.getKey(); String code = entry.getValue(); content.put(gen.getName(), code); } return JsonResult.success(content); } private Entity getEntitiyInfo(EntityInfo data) { Entity info = data.getEntity(); String urlBase = data.getUrlBase(); String basePackage = data.getBasePackage(); Entity entity = codeGenService.getEntityInfo(info.getTableName()); entity.setCode(info.getCode()); entity.setName(info.getName()); entity.setDisplayName(info.getDisplayName()); entity.setSystem(info.getSystem()); entity.setAttachment(data.entity.isAttachment()); entity.setIncludeExcel(data.entity.isIncludeExcel()); entity.setAutoAddFunction(info.isAutoAddFunction()); entity.setAutoAddMenu(info.isAutoAddFunction()); for (int i = 0; i < entity.getList().size(); i++) { Attribute attr = entity.getList().get(i); attr.setDisplayName(info.getList().get(i).getDisplayName()); attr.setShowInQuery(info.getList().get(i).isShowInQuery()); attr.setDictType(info.getList().get(i).getDictType()); attr.setVerifyList(info.getList().get(i).getVerifyList()); if(attr.getName().equals(data.getNameAttr())) { entity.setNameAttribute(attr); } } if (StringUtils.isEmpty(entity.getCode()) || StringUtils.isEmpty(entity.getSystem())) { throw new PlatformException("code,system不能为空"); } return entity; } @GetMapping(MODEL + "/{table}/test.json") @ResponseBody public void test(@PathVariable String table) { String urlBase = "cms"; Entity entity = new Entity(); entity.setCode("blog"); entity.setName("CmsBlog"); entity.setDisplayName("博客"); entity.setTableName("CMS_BLOG"); entity.setSystem("console"); Attribute idAttr = new Attribute(); idAttr.setColName("id"); idAttr.setJavaType("Long"); idAttr.setName("id"); idAttr.setDisplayName("编号"); idAttr.setId(true); entity.setIdAttribute(idAttr); Attribute nameAttr = new Attribute(); nameAttr.setColName("title"); nameAttr.setJavaType("String"); nameAttr.setName("title"); nameAttr.setDisplayName("标题"); nameAttr.setShowInQuery(true); Attribute contentAttr = new Attribute(); contentAttr.setColName("content"); contentAttr.setJavaType("String"); contentAttr.setName("content"); contentAttr.setDisplayName("内容"); contentAttr.setShowInQuery(true); Attribute createTimeAttr = new Attribute(); createTimeAttr.setColName("create_time"); createTimeAttr.setJavaType("Date"); createTimeAttr.setName("createTime"); createTimeAttr.setDisplayName("创建日期"); createTimeAttr.setShowInQuery(true); Attribute createUserIdAttr = new Attribute(); createUserIdAttr.setColName("create_user_id"); createUserIdAttr.setJavaType("Long"); createUserIdAttr.setName("createUserId"); createUserIdAttr.setDisplayName("创建人"); createUserIdAttr.setShowInQuery(true); Attribute typeAttr = new Attribute(); typeAttr.setColName("type"); typeAttr.setJavaType("String"); typeAttr.setName("type"); typeAttr.setDisplayName("博客类型"); typeAttr.setShowInQuery(true); entity.getList().add(idAttr); entity.getList().add(nameAttr); entity.getList().add(contentAttr); entity.getList().add(createTimeAttr); entity.getList().add(createUserIdAttr); entity.getList().add(typeAttr); entity.setNameAttribute(nameAttr); entity.setComment("这是一个测试模型"); // ConsoleTarget target = new ConsoleTarget(); String basePackage = "com.ibeetl.admin.console"; MavenProjectTarget target = new MavenProjectTarget(entity, basePackage); target.setUrlBase("admin"); JSGen jsGen = new JSGen(); jsGen.make(target, entity); HtmlGen htmlGen = new HtmlGen(); htmlGen.make(target, entity); String preffix = urlBase.replace('/', '.'); String basicFunctionCode = preffix+"."+entity.getCode(); JavaCodeGen javaGen = new JavaCodeGen(basePackage, entity,basicFunctionCode); javaGen.make(target, entity); MdGen mdGen = new MdGen(); mdGen.make(target, entity); } } class EntityInfo { Entity entity; String urlBase; String basePackage; String nameAttr; public Entity getEntity() { return entity; } public void setEntity(Entity entity) { this.entity = entity; } public String getUrlBase() { return urlBase; } public void setUrlBase(String urlBase) { this.urlBase = urlBase; } public String getBasePackage() { return basePackage; } public void setBasePackage(String basePackage) { this.basePackage = basePackage; } public String getNameAttr() { return nameAttr; } public void setNameAttr(String nameAttr) { this.nameAttr = nameAttr; } }