{
  "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" : { }
}