{ "author" : "Peter Cheung", "version" : "1.2.8", "userSecure" : "", "currTypeMapperGroupName" : "Default", "currTemplateGroupName" : "mybatis-util", "currColumnConfigGroupName" : "Default", "currGlobalConfigGroupName" : "Default", "typeMapper" : { }, "template" : { "mybatis-util" : { "name" : "mybatis-util", "elementList" : [ { "name" : "utilservice.java.vm", "code" : "##定义初始变量\n#set($tableName = $tool.append($tableInfo.name, \"Service\"))\n##设置回调\n$!callback.setFileName($tool.append(\"UtilService.java\"))\n$!callback.setSavePath($tool.append($tableInfo.savePath, \"/service\"))\n\n#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;\n\nimport $!{tableInfo.savePackageName}.util.R;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport org.springframework.core.io.Resource;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.multipart.MultipartFile;\n\n/**\n * 主页服务接口\n *\n * @author $!author\n * @since $!time.currTime()\n */\npublic interface UtilService {\n /**\n * 监控内存\n *\n * @return 运行环境信息\n */\n R monitor() throws JsonProcessingException;\n\n /**\n * 加盐MD5加密\n *\n * @param str 原始字符串\n * @param salt MD5盐用于混交md5\n * @return 最终生成字符串\n */\n String toMD5(String str, String salt);\n\n /**\n * 制造simple-uuid\n *\n * @return simple-uuid\n */\n String simpleUUID();\n\n /**\n * 上传文件\n *\n * @param file 上传的文件\n * @return 上传结果\n */\n R upload(MultipartFile file);\n\n /**\n * 下载文件\n *\n * @param id 文件唯一ID\n * @return 文件\n */\n ResponseEntity<Resource> download(String id);\n}" }, { "name" : "utilcontroller.java.vm", "code" : "##设置回调\n$!callback.setFileName($tool.append(\"UtilController.java\"))\n$!callback.setSavePath($tool.append($tableInfo.savePath, \"/controller\"))\n\n#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;\n\nimport $!{tableInfo.savePackageName}.service.UtilService;\nimport $!{tableInfo.savePackageName}.util.R;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.annotations.ApiParam;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.validation.annotation.Validated;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.view.RedirectView;\n\nimport javax.annotation.Resource;\nimport javax.validation.constraints.NotNull;\n\n/**\n * 工具对象控制层\n *\n * @author $!author\n * @since $!time.currTime()\n */\n@Slf4j\n@Validated\n@Api(tags = \"工具对象\")\n@RestController\n@RequestMapping(\"api/util\")\npublic class UtilController {\n /**\n * 服务对象\n */\n @Resource\n private UtilService utilService;\n\n /**\n * 监控内存\n *\n * @return 运行环境信息\n * @throws JsonProcessingException json转化异常\n */\n @ApiOperation(\"监控内存\")\n @GetMapping(\"monitor\")\n public R monitor() throws JsonProcessingException {\n return this.utilService.monitor();\n }\n\n /**\n * 上传文件\n *\n * @param file 上传的文件\n * @return 上传结果\n */\n @ApiOperation(\"上传文件\")\n @PostMapping(\"upload\")\n public R upload(@ApiParam(value = \"文件\") @RequestParam(\"file\") @NotNull(message = \"文件不允许为空\") MultipartFile file) {\n return this.utilService.upload(file);\n }\n\n /**\n * 下载文件\n *\n * @param id 文件唯一ID\n * @return 文件\n */\n @ApiOperation(\"下载文件\")\n @GetMapping(\"download/{id}\")\n public ResponseEntity<org.springframework.core.io.Resource> downloadFile(@ApiParam(value = \"文件唯一ID\") @NotNull(message = \"文件唯一ID不允许为空\") @PathVariable(\"id\") String id) {\n return this.utilService.download(id);\n }\n\n /**\n * 跳转到传入路径\n */\n @ApiOperation(\"跳转到传入路径\")\n @GetMapping(\"target\")\n public RedirectView redirectToUrl(@ApiParam(value = \"传入路径\") @NotNull(message = \"传入路径不允许为空\") String to) {\n return new RedirectView() {{\n setUrl(to);\n }};\n }\n}" }, { "name" : "uploadfileobject.sql.vm", "code" : "##设置回调\n$!callback.setFileName($tool.append(\"uploadfileobject.sql\"))\n$!callback.setSavePath($tool.append($modulePath, \"/src/main/resources/sql\"))\nCREATE TABLE upload_file_object\n(\n id CHAR(32) comment '文件唯一ID',\n name VARCHAR(255) comment '原始文件名',\n content_type VARCHAR(255) comment '文件的内容类型',\n size BIGINT comment '文件的大小(以字节为单位)',\n create_time DATETIME default now() comment '文件的创建时间',\n PRIMARY KEY (id)\n) comment '上传文件';" }, { "name" : "utilserviceimpl.java.vm", "code" : "##设置回调\n$!callback.setFileName($tool.append(\"UtilServiceImpl.java\"))\n$!callback.setSavePath($tool.append($tableInfo.savePath, \"/service/impl\"))\n\n#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;\n\nimport $!{tableInfo.savePackageName}.config.exception.AllExceptionHandle;\nimport $!{tableInfo.savePackageName}.domain.UploadFileObject;\nimport $!{tableInfo.savePackageName}.mapper.UploadFileObjectMapper;\nimport $!{tableInfo.savePackageName}.service.UtilService;\nimport $!{tableInfo.savePackageName}.util.R;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.core.io.UrlResource;\nimport org.springframework.http.ContentDisposition;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.DigestUtils;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport javax.annotation.Resource;\nimport java.io.File;\nimport java.lang.management.*;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.time.LocalDateTime;\nimport java.time.format.DateTimeFormatter;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Properties;\nimport java.util.UUID;\n\nimport static #if($tableInfo.savePackageName)$!{tableInfo.savePackageName}.#{end}config.constant.Constant.SAVE_FOLDER;\n\n/**\n * 主页服务实现类\n *\n * @author $!author\n * @since $!time.currTime()\n */\n@Slf4j\n@Service\npublic class UtilServiceImpl implements UtilService {\n /**\n * Jackson核心类\n */\n @Resource\n private ObjectMapper objectMapper;\n @Resource\n private AllExceptionHandle allExceptionHandle;\n @Resource\n private UploadFileObjectMapper uploadFileObjectMapper;\n\n /**\n * 监控内存\n *\n * @return 运行环境信息\n */\n @Override\n public R monitor() throws JsonProcessingException {\n OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();\n String osName = System.getProperty(\"os.name\");\n String osArch = System.getProperty(\"os.arch\");\n long memorySize = Runtime.getRuntime().totalMemory();\n long freeMemorySize = Runtime.getRuntime().freeMemory();\n long maxMemory = Runtime.getRuntime().maxMemory();\n MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();\n MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();\n MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();\n ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();\n HashMap<String, Object> map = new HashMap<>();\n map.put(\"当前时间\", LocalDateTime.now().format(DateTimeFormatter.ofPattern(\"yyyy年MM月dd日 H点m分s秒\")));\n map.put(\"计算机系统信息\", osName + \" \" + osArch);\n map.put(\"计算机系统版本\", operatingSystemMXBean.getVersion());\n map.put(\"计算机CPU核数\", operatingSystemMXBean.getAvailableProcessors());\n map.put(\"Java虚拟机最初向操作系统请求用于堆内存管理的内存量\", heapMemoryUsage.getInit() / 1024 / 1024 + \"MB\");\n map.put(\"Java虚拟机已用堆内存量\", heapMemoryUsage.getUsed() / 1024 / 1024 + \"MB\");\n map.put(\"Java虚拟机中返回当前活动线程数,包括守护线程和非守护线程\", threadMXBean.getThreadCount());\n map.put(\"不设置情况下Java虚拟机将获取的内存总量\", memorySize / 1024 / 1024 + \"MB\");\n map.put(\"不设置情况下Java虚拟机将获取的可用内存量\", freeMemorySize / 1024 / 1024 + \"MB\");\n map.put(\"不设置情况下Java虚拟机将尝试使用的最大内存量\", maxMemory / 1024 / 1024 + \"MB\");\n map.put(\"Java虚拟机最初向操作系统请求用于非堆内存大小\", nonHeapMemoryUsage.getInit() / 1024 / 1024 + \"MB\");\n map.put(\"Java虚拟机已用非堆内存大小\", nonHeapMemoryUsage.getUsed() / 1024 / 1024 + \"MB\");\n HashMap<Object, Object> sysMap = new HashMap<>();\n System.getProperties().forEach((key, value) -> sysMap.put(key, value));\n map.put(\"系统属性\", sysMap);\n // map转json\n String json = objectMapper.writeValueAsString(map);\n log.info(json);\n return R.ok().data(map);\n }\n\n /**\n * 加盐MD5加密\n *\n * @param str 原始字符串\n * @param salt 盐值\n * @return 最终生成字符串\n */\n @Override\n public String toMD5(String str, String salt) {\n String base = str + salt;\n return DigestUtils.md5DigestAsHex(base.getBytes());\n }\n\n /**\n * 制造simple-uuid\n *\n * @return simple-uuid\n */\n @Override\n public String simpleUUID() {\n return UUID.randomUUID().toString().replaceAll(\"-\", \"\");\n }\n\n /**\n * 上传文件\n *\n * @param file 上传的文件\n * @return 上传结果\n */\n @Override\n public R upload(MultipartFile file) {\n Properties props = System.getProperties();\n // 根路径\n String rootPath = props.getProperty(\"user.dir\");\n // 分隔符\n String separator = props.getProperty(\"file.separator\");\n\n // 检查文件夹是否存在,如果不存在则创建\n String folderPath = rootPath + separator + SAVE_FOLDER;\n File folder = new File(folderPath);\n if (!folder.exists()) {\n folder.mkdir();\n }\n\n // 检查上传文件是否为空文件\n if (file.isEmpty()) {\n return R.badRequest().data(\"文件为空\");\n }\n\n // 文件实体类\n UploadFileObject uploadFileObject = new UploadFileObject();\n // 文件唯一ID\n uploadFileObject.setId(simpleUUID());\n // 文件的原始文件名\n uploadFileObject.setName(file.getOriginalFilename());\n // 上传文件的内容类型\n uploadFileObject.setContentType(file.getContentType());\n // 返回上传文件的大小(以字节为单位)\n uploadFileObject.setSize(file.getSize());\n // 创建时间\n uploadFileObject.setCreateTime(new Date());\n\n // 创建保存文件的文件夹\n String filePath = folderPath + separator + uploadFileObject.getId();\n new File(filePath).mkdir();\n\n // 保存文件\n String fileOriginalPath = filePath + separator + uploadFileObject.getName();\n try {\n file.transferTo(new File(fileOriginalPath));\n uploadFileObjectMapper.insert(uploadFileObject);\n return R.ok().data(uploadFileObject);\n } catch (Exception e) {\n log.error(\"上传文件报错\");\n allExceptionHandle.e(e);\n return R.exp().data(\"上传失败\");\n }\n }\n\n /**\n * 下载文件\n *\n * @param id 文件唯一ID\n * @return 文件\n */\n @Override\n public ResponseEntity<org.springframework.core.io.Resource> download(String id) {\n // 文件参数\n UploadFileObject uploadFileObject = uploadFileObjectMapper.queryById(id);\n if (uploadFileObject == null) {\n log.error(\"id为\" + id + \"的文件在文件表中不存在\");\n // 文件不存在时返回 404 错误\n return ResponseEntity.notFound().build();\n }\n Properties props = System.getProperties();\n // 根路径\n String rootPath = props.getProperty(\"user.dir\");\n // 分隔符\n String separator = props.getProperty(\"file.separator\");\n // 文件路径\n String folderPath = rootPath + separator + SAVE_FOLDER + separator + id;\n // 解析文件路径\n Path filePath = Paths.get(folderPath).resolve(uploadFileObject.getName()).normalize();\n try {\n // 加载文件资源\n org.springframework.core.io.Resource resource = new UrlResource(filePath.toUri());\n\n if (resource.exists()) {\n // 设置响应头\n HttpHeaders headers = new HttpHeaders();\n ContentDisposition contentDisposition = ContentDisposition.builder(\"attachment\").filename(uploadFileObject.getName(), StandardCharsets.UTF_8).build();\n headers.setContentDisposition(contentDisposition);\n headers.add(HttpHeaders.CONTENT_TYPE, uploadFileObject.getContentType());\n headers.setContentLength(uploadFileObject.getSize());\n // 返回文件内容\n return ResponseEntity.ok().headers(headers).body(resource);\n } else {\n log.error(\"id为\" + id + \"的文件在文件表中存在,但是实际不存在\");\n // 文件不存在时返回 404 错误\n return ResponseEntity.notFound().build();\n }\n } catch (Exception e) {\n log.error(\"下载文件报错\");\n allExceptionHandle.e(e);\n return ResponseEntity.internalServerError().build();\n }\n }\n}" } ] } }, "columnConfig" : { }, "globalConfig" : { } }