package cn.stylefeng.guns.gen.modular.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.stylefeng.guns.base.db.entity.DatabaseInfo; import cn.stylefeng.guns.base.db.service.DatabaseInfoService; import cn.stylefeng.guns.base.pojo.page.LayuiPageInfo; import cn.stylefeng.guns.gen.core.enums.GenDownloadEnum; import cn.stylefeng.guns.gen.core.enums.GenSessionKeyFlags; import cn.stylefeng.guns.gen.core.generator.base.model.ContextParam; import cn.stylefeng.guns.gen.core.generator.guns.GunsExecutor; import cn.stylefeng.guns.gen.core.generator.restful.RestfulApiExecutor; import cn.stylefeng.guns.gen.core.generator.restful.mybatisplus.param.MpParam; import cn.stylefeng.guns.gen.core.util.ConcatUtil; import cn.stylefeng.guns.gen.core.util.FieldsConfigHolder; import cn.stylefeng.guns.gen.modular.model.FieldConfig; import cn.stylefeng.guns.gen.modular.model.GenSessionFieldConfigs; import cn.stylefeng.guns.gen.modular.model.params.ExecuteParam; import cn.stylefeng.guns.gen.modular.model.params.SaveFieldConfigParam; import cn.stylefeng.guns.gen.modular.service.GenerateService; import cn.stylefeng.roses.core.util.HttpContext; import cn.stylefeng.roses.core.util.SpringContextHolder; import cn.stylefeng.roses.core.util.ToolUtil; import cn.stylefeng.roses.kernel.model.exception.ServiceException; import cn.stylefeng.roses.kernel.model.response.ResponseData; import cn.stylefeng.roses.kernel.model.response.SuccessResponseData; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.io.*; import java.util.*; /** * 代码生成控制器 * * @author fengshuonan * @date 2019-01-30-2:39 PM */ @Controller @Slf4j public class GeneratorController { @Autowired private GenerateService tableService; /** * 代码生成主页 * * @author fengshuonan * @Date 2019/1/30 2:49 PM */ @RequestMapping("/gen") public String index(Model model) { //获取数据源容器service DatabaseInfoService databaseInfoService = null; try { databaseInfoService = SpringContextHolder.getBean(DatabaseInfoService.class); } catch (Exception e) { throw new ServiceException(500, "请先开启数据源容器模块!"); } List all = databaseInfoService.list(new QueryWrapper<>()); model.addAttribute("dataSources", all); //清空session的缓存 HttpSession session = HttpContext.getRequest().getSession(); session.removeAttribute(GenSessionKeyFlags.TABLE_FIELD_STYLES.name()); return "/modular/gen/gen.html"; } /** * 跳转到字段列表页面 * * @author fengshuonan * @Date 2019/1/30 2:49 PM */ @RequestMapping("/tableFields") public String tableFields(@RequestParam("dbId") Long dbId, @RequestParam("tableName") String tableName, Model model) { model.addAttribute("tableName", tableName); model.addAttribute("dbId", dbId); return "/modular/gen/tableFields.html"; } /** * 获取表的字段列表 * * @author fengshuonan * @Date 2019/1/30 2:49 PM */ @RequestMapping("/getTableFieldConfigs") @ResponseBody public LayuiPageInfo getTableFieldConfigs(@RequestParam("dbId") Long dbId, @RequestParam("tableName") String tableName) { //获取这个表的所有字段以及其他信息 List tableFields = tableService.getTableFieldsConfig(dbId, tableName); LayuiPageInfo layuiPageInfo = new LayuiPageInfo(); layuiPageInfo.setData(tableFields); layuiPageInfo.setCount(tableFields.size()); return layuiPageInfo; } /** * 设置条件字段 * * @author fengshuonan * @Date 2019-05-04 21:50 */ @RequestMapping("/saveFieldsConfig") @ResponseBody public ResponseData saveFieldsConfig(@RequestBody @Valid SaveFieldConfigParam saveFieldConfigParam) { tableService.setTableFieldsConfig(saveFieldConfigParam); return new SuccessResponseData(); } /** * 执行代码生成 * * @return * @author fengshuonan * @Date 2019-01-11 */ @RequestMapping(value = "/execute", method = RequestMethod.GET) @ResponseBody public ResponseEntity execute(ExecuteParam executeParam) { //获取字符串拼接数组 String[] tableArray = ConcatUtil.getArray(executeParam.getTables()); //获取跳转类型的数组 String[] jumpTypeArray = ConcatUtil.getArray(executeParam.getJumpTypeStr()); Set jumpTypeSet = CollUtil.newHashSet(jumpTypeArray); Map jumpTypeMap = new HashMap<>(8); for (String tableName : tableArray) { jumpTypeMap.put(tableName, jumpTypeSet.contains(tableName)); } //获取数据源信息 DatabaseInfoService databaseInfoService = null; try { databaseInfoService = SpringContextHolder.getBean(DatabaseInfoService.class); } catch (Exception e) { throw new ServiceException(500, "请先开启数据源容器模块!"); } DatabaseInfo databaseInfo = databaseInfoService.getById(executeParam.getDataSourceId()); ContextParam contextParam = new ContextParam(); contextParam.setAuthor(executeParam.getAuthor()); contextParam.setProPackage(executeParam.getProPackage()); contextParam.setJdbcDriver(databaseInfo.getJdbcDriver()); contextParam.setJdbcUserName(databaseInfo.getUserName()); contextParam.setJdbcPassword(databaseInfo.getPassword()); contextParam.setJdbcUrl(databaseInfo.getJdbcUrl()); contextParam.setJumpTypeMap(jumpTypeMap); if ("Y".equalsIgnoreCase(executeParam.getSwagger())) { contextParam.setSwagger(true); } else { contextParam.setSwagger(false); } if ("Y".equalsIgnoreCase(executeParam.getRemote())) { contextParam.setRemote(true); } else { contextParam.setRemote(false); } //处理modularName,如果modularName传值不为空,则待上左斜杠路径 if (ToolUtil.isNotEmpty(executeParam.getModularName())) { String modularName = "/" + executeParam.getModularName(); contextParam.setModularName(modularName); } String outputPath = ""; long fileName = IdWorker.getId(); if (Objects.equals(GenDownloadEnum.DEFAULT_PATH.name(), executeParam.getGenLocation())) { //获取临时目录 outputPath = System.getProperty("java.io.tmpdir") + File.separator + "gunsGeneration" + File.separator + fileName; contextParam.setGenDownloadEnum(GenDownloadEnum.DEFAULT_PATH); } else if (Objects.equals(GenDownloadEnum.PROJECT_PATH.name(), executeParam.getGenLocation())) { //获取项目的绝对路径 TODO 可作为参数变量 outputPath = new File("").getAbsolutePath() + File.separator + "guns-vip-main" + File.separator + "src" + File.separator + "main"; contextParam.setGenDownloadEnum(GenDownloadEnum.PROJECT_PATH); } contextParam.setOutputPath(outputPath); MpParam mpContextParam = new MpParam(); mpContextParam.setGeneratorInterface(true); mpContextParam.setIncludeTables(tableArray); if (StrUtil.isNotEmpty(executeParam.getRemovePrefix())) { mpContextParam.setRemoveTablePrefix(new String[]{(executeParam.getRemovePrefix())}); } try { //将session中的字段配置数据传递到threadlocal中 HttpSession session = HttpContext.getRequest().getSession(); GenSessionFieldConfigs sessionFieldConfigs = (GenSessionFieldConfigs) session.getAttribute(GenSessionKeyFlags.TABLE_FIELD_STYLES.name()); FieldsConfigHolder.put(sessionFieldConfigs); //如果是Guns单体版本生成 if (executeParam.getVersion().equalsIgnoreCase("single")) { GunsExecutor.executor(contextParam, mpContextParam); } else { //如果是微服务版本代码生成 RestfulApiExecutor.executor(contextParam, mpContextParam); } } finally { FieldsConfigHolder.remove(); } //如果是打包下载的 if (Objects.equals(GenDownloadEnum.DEFAULT_PATH.name(), executeParam.getGenLocation())) { File zip = ZipUtil.zip(outputPath); return renderFile(fileName + ".zip", zip.getAbsolutePath()); } else { return null; } } /** * 返回前台文件流 * * @param fileName 文件名 * @param inputStream 输入流 * @return * @author 0x0001 */ private ResponseEntity renderFile(String fileName, InputStream inputStream) { InputStreamResource resource = new InputStreamResource(inputStream); String dfileName = null; try { dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", dfileName); return new ResponseEntity<>(resource, headers, HttpStatus.CREATED); } /** * 返回前台文件流 * * @author fengshuonan * @date 2017年2月28日 下午2:53:19 */ private ResponseEntity renderFile(String fileName, String filePath) { try { final FileInputStream inputStream = new FileInputStream(filePath); return renderFile(fileName, inputStream); } catch (FileNotFoundException e) { throw new RuntimeException("文件读取错误"); } } /** * 返回前台文件流 * * @author fengshuonan * @date 2017年2月28日 下午2:53:19 */ private ResponseEntity renderFile(String fileName, byte[] fileBytes) { return renderFile(fileName, new ByteArrayInputStream(fileBytes)); } }