VisualdevGenController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package jnpf.generater.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.annotation.SaMode;
  4. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  5. import io.swagger.v3.oas.annotations.Operation;
  6. import io.swagger.v3.oas.annotations.Parameter;
  7. import io.swagger.v3.oas.annotations.Parameters;
  8. import io.swagger.v3.oas.annotations.tags.Tag;
  9. import jakarta.servlet.http.HttpServletRequest;
  10. import jnpf.base.ActionResult;
  11. import jnpf.base.entity.DictionaryDataEntity;
  12. import jnpf.base.entity.VisualdevEntity;
  13. import jnpf.base.entity.VisualdevReleaseEntity;
  14. import jnpf.base.model.DownloadCodeForm;
  15. import jnpf.base.model.VisualAliasForm;
  16. import jnpf.base.model.read.ReadListVO;
  17. import jnpf.base.model.read.ReadModel;
  18. import jnpf.base.service.DictionaryDataService;
  19. import jnpf.base.service.VisualAliasService;
  20. import jnpf.base.service.VisualdevReleaseService;
  21. import jnpf.base.service.VisualdevService;
  22. import jnpf.base.util.ReadFile;
  23. import jnpf.base.util.VisualUtil;
  24. import jnpf.base.vo.DownloadVO;
  25. import jnpf.base.vo.ListVO;
  26. import jnpf.config.ConfigValueUtil;
  27. import jnpf.constant.FileTypeConstant;
  28. import jnpf.constant.MsgCode;
  29. import jnpf.entity.FileParameter;
  30. import jnpf.exception.DataException;
  31. import jnpf.generater.service.VisualdevGenService;
  32. import jnpf.model.visualJson.TableModel;
  33. import jnpf.util.*;
  34. import org.dromara.x.file.storage.core.FileInfo;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.web.bind.annotation.*;
  37. import org.springframework.web.multipart.MultipartFile;
  38. import java.io.File;
  39. import java.util.ArrayList;
  40. import java.util.Arrays;
  41. import java.util.List;
  42. import java.util.Objects;
  43. /**
  44. * 可视化开发功能表
  45. *
  46. * @author JNPF开发平台组
  47. * @version V3.1.0
  48. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  49. * @date 2021/3/16
  50. */
  51. @Tag(name = "代码生成器", description = "Generater")
  52. @RestController
  53. @RequestMapping("/api/visualdev/Generater")
  54. public class VisualdevGenController {
  55. @Autowired
  56. private ConfigValueUtil configValueUtil;
  57. @Autowired
  58. private RedisUtil redisUtil;
  59. @Autowired
  60. private VisualdevService visualdevService;
  61. @Autowired
  62. private VisualdevReleaseService visualdevReleaseService;
  63. @Autowired
  64. private VisualdevGenService visualdevGenService;
  65. @Autowired
  66. private DictionaryDataService dictionaryDataApi;
  67. @Autowired
  68. private VisualAliasService aliasService;
  69. /**
  70. * 下载文件
  71. *
  72. * @return
  73. */
  74. @NoDataSourceBind()
  75. @Operation(summary = "下载文件")
  76. @GetMapping("/DownloadVisCode")
  77. public void downloadCode() throws DataException {
  78. HttpServletRequest request = ServletUtil.getRequest();
  79. String reqJson = request.getParameter("encryption");
  80. String name = request.getParameter("name");
  81. String fileNameAll = DesUtil.aesDecode(reqJson);
  82. if (!StringUtil.isEmpty(fileNameAll)) {
  83. String token = fileNameAll.split("#")[0];
  84. if (TicketUtil.parseTicket(token) != null) {
  85. TicketUtil.deleteTicket(token);
  86. String fileName = fileNameAll.split("#")[1];
  87. String path = FilePathUtil.getFilePath(FileTypeConstant.CODETEMP);
  88. //下载到本地
  89. FileUploadUtils.downloadFile(new FileParameter(path, fileName), inputStream -> {
  90. FileDownloadUtil.outFile(inputStream, name);
  91. });
  92. //删除打包的临时文件,释放存储
  93. // FileUploadUtils.deleteFileByPathAndFileName(path, fileName);
  94. } else {
  95. throw new DataException(MsgCode.VS014.get());
  96. }
  97. } else {
  98. throw new DataException(MsgCode.VS014.get());
  99. }
  100. }
  101. @Operation(summary = "获取命名空间")
  102. @GetMapping("/AreasName")
  103. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  104. public ActionResult getAreasName() {
  105. String areasName = configValueUtil.getCodeAreasName();
  106. List<String> areasNameList = new ArrayList(Arrays.asList(areasName.split(",")));
  107. return ActionResult.success(areasNameList);
  108. }
  109. @Operation(summary = "下载代码")
  110. @Parameters({
  111. @Parameter(name = "id", description = "主键"),
  112. })
  113. @PostMapping("/{id}/Actions/DownloadCode")
  114. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  115. @DSTransactional
  116. public ActionResult downloadCode(@PathVariable("id") String id, @RequestBody DownloadCodeForm downloadCodeForm) throws Exception {
  117. if (downloadCodeForm.getModule() != null) {
  118. DictionaryDataEntity info = dictionaryDataApi.getInfo(downloadCodeForm.getModule());
  119. if (info != null) {
  120. downloadCodeForm.setModule(info.getEnCode());
  121. }
  122. }
  123. VisualdevEntity visualdevEntity = JsonUtil.getJsonToBean(visualdevReleaseService.getById(id), VisualdevEntity.class);
  124. String s = VisualUtil.checkPublishVisualModel(visualdevEntity, MsgCode.VS006.get());
  125. if (s != null) {
  126. return ActionResult.fail(s);
  127. }
  128. DownloadVO vo;
  129. String fileName = visualdevGenService.codeGengerateV3(visualdevEntity, downloadCodeForm);
  130. //服务器生成路径
  131. String filePath = FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + fileName + ".zip";
  132. FileUtil.toZip(filePath, true, FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + fileName);
  133. // 删除源文件
  134. FileUtil.deleteFileAll(new File(FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + fileName));
  135. //上传压缩包到服务器
  136. MultipartFile multipartFile = FileUtil.createFileItem(new File(XSSEscape.escapePath(filePath)));
  137. FileInfo fileInfo = FileUploadUtils.uploadFile(new FileParameter(configValueUtil.getServiceDirectoryPath(), fileName + ".zip"), multipartFile);
  138. // 删除压缩包
  139. FileUtil.deleteFileAll(new File(filePath));
  140. //下载文件服务器上的压缩包
  141. vo = DownloadVO.builder().name(fileInfo.getFilename()).url(UploaderUtil.uploaderVisualFile(fileInfo.getFilename()) + "&name=" + fileName + ".zip").build();
  142. if (vo == null) {
  143. return ActionResult.fail(MsgCode.FA006.get());
  144. }
  145. return ActionResult.success(vo);
  146. }
  147. /**
  148. * 输出移动开发模板
  149. *
  150. * @return
  151. */
  152. @Operation(summary = "预览代码")
  153. @Parameters({
  154. @Parameter(name = "id", description = "主键"),
  155. })
  156. @PostMapping("/{id}/Actions/CodePreview")
  157. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  158. public ActionResult codePreview(@PathVariable("id") String id, @RequestBody DownloadCodeForm downloadCodeForm) throws Exception {
  159. if (downloadCodeForm.getModule() != null) {
  160. DictionaryDataEntity info = dictionaryDataApi.getInfo(downloadCodeForm.getModule());
  161. if (info != null) {
  162. downloadCodeForm.setModule(info.getEnCode());
  163. }
  164. }
  165. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(id);
  166. VisualdevEntity visualdevEntity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  167. String s = VisualUtil.checkPublishVisualModel(visualdevEntity, "预览");
  168. if (s != null) {
  169. return ActionResult.fail(s);
  170. }
  171. String fileName = visualdevGenService.codeGengerateV3(visualdevEntity, downloadCodeForm);
  172. List<ReadListVO> dataList = ReadFile.priviewCode(FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + fileName);
  173. // 删除源文件
  174. FileUtil.deleteFileAll(new File(FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + fileName));
  175. if (dataList.size() == 0) {
  176. return ActionResult.fail(MsgCode.FA015.get());
  177. }
  178. //代码对比
  179. if (downloadCodeForm.isContrast()) {
  180. VisualdevEntity oldEntity = visualdevService.getInfo(id);
  181. //修改状态 - 旧的是已发布,新的是草稿版本;发布状态 - 旧的是 旧的发布版本,新的是当前发布版本;
  182. boolean statusUpdate = true;
  183. if (Objects.equals(oldEntity.getState(), 1) && StringUtil.isNotBlank(releaseEntity.getOldContent())) {
  184. statusUpdate = false;
  185. VisualdevEntity jsonToBean = JsonUtil.getJsonToBean(releaseEntity.getOldContent(), VisualdevEntity.class);
  186. oldEntity.setVisualTables(jsonToBean.getVisualTables());
  187. oldEntity.setFormData(jsonToBean.getFormData());
  188. oldEntity.setColumnData(jsonToBean.getColumnData());
  189. oldEntity.setAppColumnData(jsonToBean.getAppColumnData());
  190. oldEntity.setWebType(jsonToBean.getWebType());
  191. oldEntity.setDbLinkId(jsonToBean.getDbLinkId());
  192. }
  193. String oldFileName = visualdevGenService.codeGengerateV3(oldEntity, downloadCodeForm);
  194. List<ReadListVO> oldDataList = ReadFile.priviewCode(FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + oldFileName);
  195. // 删除源文件
  196. FileUtil.deleteFileAll(new File(FileUploadUtils.getLocalBasePath() + configValueUtil.getServiceDirectoryPath() + oldFileName));
  197. for (ReadListVO m : dataList) {
  198. ReadListVO n = oldDataList.stream().filter(t -> m.getFileName().equals(t.getFileName())).findFirst().orElse(null);
  199. if (Objects.nonNull(n)) {
  200. List<ReadModel> mChildren = m.getChildren();
  201. List<ReadModel> nChildren = n.getChildren();
  202. for (ReadModel mChild : mChildren) {
  203. ReadModel nChild = nChildren.stream().filter(t -> mChild.getFileName().equals(t.getFileName())).findFirst().orElse(null);
  204. String nfileContent = Objects.nonNull(nChild) ? nChild.getFileContent() : "";
  205. if (statusUpdate) {
  206. mChild.setOldFileContent(mChild.getFileContent());
  207. mChild.setFileContent(nfileContent);
  208. } else {
  209. mChild.setOldFileContent(nfileContent);
  210. }
  211. }
  212. }
  213. }
  214. }
  215. ListVO datas = new ListVO<>();
  216. datas.setList(dataList);
  217. return ActionResult.success(datas);
  218. }
  219. /**
  220. * App预览(后台APP表单设计)
  221. *
  222. * @return
  223. */
  224. @Operation(summary = "App预览(后台APP表单设计)")
  225. @Parameters({
  226. @Parameter(name = "data", description = "数据"),
  227. })
  228. @PostMapping("/App/Preview")
  229. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  230. public ActionResult appPreview(String data) {
  231. String id = RandomUtil.uuId();
  232. redisUtil.insert(id, data, 300);
  233. return ActionResult.success((Object) id);
  234. }
  235. /**
  236. * App预览(后台APP表单设计)
  237. *
  238. * @return
  239. */
  240. @Operation(summary = "App预览查看")
  241. @Parameters({
  242. @Parameter(name = "id", description = "主键"),
  243. })
  244. @GetMapping("/App/{id}/Preview")
  245. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  246. public ActionResult preview(@PathVariable("id") String id) {
  247. if (redisUtil.exists(id)) {
  248. Object object = redisUtil.getString(id);
  249. return ActionResult.success(object);
  250. } else {
  251. return ActionResult.fail(MsgCode.FA019.get());
  252. }
  253. }
  254. @Operation(summary = "获取命名规范")
  255. @Parameters({
  256. @Parameter(name = "id", description = "主键"),
  257. })
  258. @GetMapping("/{id}/Alias/Info")
  259. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  260. public ActionResult getAliasInfo(@PathVariable("id") String id) {
  261. List<TableModel> aliasInfo = aliasService.getAliasInfo(id);
  262. return ActionResult.success(aliasInfo);
  263. }
  264. @Operation(summary = "命名规范保存")
  265. @Parameters({
  266. @Parameter(name = "id", description = "主键"),
  267. })
  268. @PostMapping("/{id}/Alias/Save")
  269. @SaCheckPermission(value = {"onlineDev.formDesign", "generator.webForm", "generator.flowForm"}, mode = SaMode.OR)
  270. public ActionResult aliasSave(@PathVariable("id") String id, @RequestBody VisualAliasForm form) {
  271. aliasService.aliasSave(id, form);
  272. return ActionResult.success(MsgCode.SU002.get());
  273. }
  274. }