From 16ac69ace931e82bae1b681da25769f4670dd037 Mon Sep 17 00:00:00 2001 From: liyd <1419499670@qq.com> Date: Tue, 6 Dec 2022 14:53:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/config/ConfigurerAdapter.java | 1 - .../org/nl/config/saconfig/CorsFilter.java | 6 +- .../common/generator/domain/GenConfig.java | 2 +- .../generator/rest/GenConfigController.java | 1 - .../generator/service/GenConfigService.java | 1 - .../service/impl/GenConfigServiceImpl.java | 1 - .../service/impl/QuartzJobServiceImpl.java | 2 + .../java/org/nl/modules/system/wql/sys.xls | Bin 262144 -> 266240 bytes .../modules/tools/config/MultipartConfig.java | 34 ++++ .../nl/modules/tools/domain/LocalStorage.java | 78 +++++++++ .../tools/rest/LocalStorageController.java | 77 +++++++++ .../tools/service/LocalStorageService.java | 51 ++++++ .../service/impl/LocalStorageServiceImpl.java | 154 ++++++++++++++++++ nladmin-ui/src/views/generator/config.vue | 10 +- nladmin-ui/src/views/system/timing/index.vue | 4 +- nladmin-ui/src/views/tools/storage/index.vue | 18 +- 16 files changed, 418 insertions(+), 22 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/config/MultipartConfig.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/domain/LocalStorage.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/LocalStorageService.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/ConfigurerAdapter.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/ConfigurerAdapter.java index a02c482..feb2bd2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/ConfigurerAdapter.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/ConfigurerAdapter.java @@ -41,7 +41,6 @@ public class ConfigurerAdapter implements WebMvcConfigurer { this.properties = properties; } - @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { FileProperties.ElPath path = properties.getPath(); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/saconfig/CorsFilter.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/saconfig/CorsFilter.java index f7b387c..cc2e734 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/saconfig/CorsFilter.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/saconfig/CorsFilter.java @@ -2,6 +2,7 @@ package org.nl.config.saconfig; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import org.springframework.web.cors.CorsConfiguration; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -23,15 +24,14 @@ public class CorsFilter implements Filter { throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; - // 允许指定域访问跨域资源 response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有请求方式 - response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Allow-Methods", "*"); // 有效时间 response.setHeader("Access-Control-Max-Age", "3600"); // 允许的header参数 - response.setHeader("Access-Control-Allow-Headers", "x-requested-with,satoken"); + response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Allow-Credentials", "true"); // 如果是预检请求,直接返回 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/domain/GenConfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/domain/GenConfig.java index ed720c5..68865e0 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/domain/GenConfig.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/domain/GenConfig.java @@ -51,5 +51,5 @@ public class GenConfig implements Serializable { private String prefix; @ApiModelProperty(value = "是否覆盖") - private Boolean cover = false; + private String cover = "0"; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/rest/GenConfigController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/rest/GenConfigController.java index a259648..c09efdf 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/rest/GenConfigController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/rest/GenConfigController.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.nl.modules.common.generator.domain.GenConfig; import org.nl.modules.common.generator.service.GenConfigService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/GenConfigService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/GenConfigService.java index a370fce..512a5a8 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/GenConfigService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/GenConfigService.java @@ -1,7 +1,6 @@ package org.nl.modules.common.generator.service; import com.alibaba.fastjson.JSONObject; -import org.nl.modules.common.generator.domain.GenConfig; /** * @author: lyd diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/impl/GenConfigServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/impl/GenConfigServiceImpl.java index 2a51ee6..facb14a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/impl/GenConfigServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/common/generator/service/impl/GenConfigServiceImpl.java @@ -2,7 +2,6 @@ package org.nl.modules.common.generator.service.impl; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.nl.modules.common.generator.domain.GenConfig; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/quartz/service/impl/QuartzJobServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/quartz/service/impl/QuartzJobServiceImpl.java index 30745d6..c7f6ad5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/quartz/service/impl/QuartzJobServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/quartz/service/impl/QuartzJobServiceImpl.java @@ -160,6 +160,7 @@ public class QuartzJobServiceImpl implements QuartzJobService { * @param quartzJob / */ @Override + @Transactional(rollbackFor = Exception.class) public void updateIsPause(JSONObject quartzJob) { WQLObject jobTab = WQLObject.getWQLObject("sys_quartz_job"); if (quartzJob.getString("is_pause").equals("1")) { @@ -207,6 +208,7 @@ public class QuartzJobServiceImpl implements QuartzJobService { * @param ids */ @Override + @Transactional(rollbackFor = Exception.class) public void delete(Set ids) { WQLObject jobTab = WQLObject.getWQLObject("sys_quartz_job"); WQLObject logTab = WQLObject.getWQLObject("sys_quartz_log"); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/wql/sys.xls b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/wql/sys.xls index b30935b33c4abdadde72a66d280cb3f7fddb7ba0..bf3d20c3d8d05842d58a84906d6fbb03c21c18ac 100644 GIT binary patch delta 34510 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 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/config/MultipartConfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/config/MultipartConfig.java new file mode 100644 index 0000000..dbfe213 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/config/MultipartConfig.java @@ -0,0 +1,34 @@ +package org.nl.modules.tools.config; + +import org.springframework.boot.web.servlet.MultipartConfigFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.MultipartConfigElement; +import java.io.File; + +/** + * @author: lyd + * @description: + * @Date: 2022/12/6 + */ +@Configuration +public class MultipartConfig { + + /** + * 文件上传临时路径 + */ + @Bean + MultipartConfigElement multipartConfigElement() { + MultipartConfigFactory factory = new MultipartConfigFactory(); + String location = System.getProperty("user.home") + "/.eladmin/file/tmp"; + File tmpFile = new File(location); + if (!tmpFile.exists()) { + if (!tmpFile.mkdirs()) { + System.out.println("create was not successful."); + } + } + factory.setLocation(location); + return factory.createMultipartConfig(); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/domain/LocalStorage.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/domain/LocalStorage.java new file mode 100644 index 0000000..c876261 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/domain/LocalStorage.java @@ -0,0 +1,78 @@ +package org.nl.modules.tools.domain; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import org.nl.modules.common.utils.SecurityUtils; + +import java.io.Serializable; + +/** + * @author: lyd + * @description: + * @Date: 2022/12/6 + */ +@Data +public class LocalStorage implements Serializable { + /** 标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long storage_id; + + /** 文件真实的名称 */ + private String real_name; + + /** 文件名 */ + private String name; + + /** 后缀 */ + private String suffix; + + /** 路径 */ + private String path; + + /** 类型 */ + private String type; + + /** 大小 */ + private String size; + + /** 创建人标识 */ + private String create_id; + + /** 创建人 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人标识 */ + private String update_optid; + + /** 修改人 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + public LocalStorage(String realName,String name, String suffix, String path, String type, String size) { + this.storage_id = IdUtil.getSnowflake(1,1).nextId(); + this.real_name = realName; + this.name = name; + this.suffix = suffix; + this.path = path; + this.type = type; + this.size = size; + this.create_id = this.update_optid = SecurityUtils.getCurrentUserId().toString(); + this.create_name = this.update_optname = SecurityUtils.getCurrentNickName(); + this.create_time = this.update_time = DateUtil.now(); + } + + public void copy(LocalStorage source){ + BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java new file mode 100644 index 0000000..c6dae9d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java @@ -0,0 +1,77 @@ +package org.nl.modules.tools.rest; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.tools.domain.LocalStorage; +import org.nl.modules.tools.service.LocalStorageService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +/** + * @author: lyd + * @description: 本地存储管理 + * @Date: 2022/12/5 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "工具:本地存储管理") +@RequestMapping("/api/localStorage") +public class LocalStorageController { + private final LocalStorageService localStorageService; + + @ApiOperation("查询文件") + @GetMapping +// @SaCheckPermission("storage:list") + public ResponseEntity query(@RequestParam Map criteria, Pageable pageable) { + return new ResponseEntity<>(localStorageService.queryAll(criteria, pageable), HttpStatus.OK); + } + + @ApiOperation("上传文件") + @PostMapping + @SaIgnore +// @SaCheckPermission("storage:add") + public ResponseEntity create(@RequestParam String name, @RequestParam("file") MultipartFile file) { + return new ResponseEntity<>(localStorageService.create(name, file), HttpStatus.CREATED); + } + + @PostMapping("/pictures") + @ApiOperation("上传图片") + public ResponseEntity upload(@RequestParam MultipartFile file) { + // 判断文件是否为图片 + String suffix = FileUtil.getExtensionName(file.getOriginalFilename()); + if (!FileUtil.IMAGE.equals(FileUtil.getFileType(suffix))) { + throw new BadRequestException("只能上传图片"); + } + return new ResponseEntity<>(localStorageService.create(null, file), HttpStatus.OK); + } + + @Log("修改文件") + @ApiOperation("修改文件") + @PutMapping + @SaCheckPermission("storage:edit") + public ResponseEntity update(@Validated @RequestBody LocalStorage resources) { + localStorageService.update(resources); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除文件") + @DeleteMapping + @ApiOperation("多选删除") + public ResponseEntity delete(@RequestBody Long[] ids) { + localStorageService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/LocalStorageService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/LocalStorageService.java new file mode 100644 index 0000000..ae9a7b1 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/LocalStorageService.java @@ -0,0 +1,51 @@ +package org.nl.modules.tools.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.tools.domain.LocalStorage; +import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +/** + * @author: lyd + * @description: + * @Date: 2022/12/5 + */ +public interface LocalStorageService { + /** + * + * @param criteria + * @param pageable + * @return + */ + Object queryAll(Map criteria, Pageable pageable); + + /** + * 上传 + * @param name 文件名称 + * @param file 文件 + * @return + */ + JSONObject create(String name, MultipartFile multipartFile); + + /** + * 编辑 + * @param resources 文件信息 + */ + void update(LocalStorage resources); + + /** + * 通过id找文件信息 + * @param id + * @return + */ + JSONObject findById(String id); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java new file mode 100644 index 0000000..d41cf99 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java @@ -0,0 +1,154 @@ +package org.nl.modules.tools.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.config.FileProperties; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.common.utils.ValidationUtil; +import org.nl.modules.tools.domain.LocalStorage; +import org.nl.modules.tools.service.LocalStorageService; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.Map; + +/** + * @author: lyd + * @description: + * @Date: 2022/12/5 + */ +@Service +@RequiredArgsConstructor +public class LocalStorageServiceImpl implements LocalStorageService { + + private final FileProperties properties; + /** + * @param criteria + * @param pageable + * @return + */ + @Override + public Object queryAll(Map criteria, Pageable pageable) { + WQLObject toolTab = WQLObject.getWQLObject("tool_local_storage"); + String param = "1=1"; + if (ObjectUtil.isNotEmpty(criteria.get("blurry"))) { + param = param + " AND name = '%" + criteria.get("blurry").toString() + "%'"; + } + ResultBean rb = toolTab.pagequery(WqlUtil.getHttpContext(pageable), param, "create_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + /** + * 上传 + * + * @param name 文件名称 + * @param multipartFile 文件 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject create(String name, MultipartFile multipartFile) { + WQLObject toolTab = WQLObject.getWQLObject("tool_local_storage"); + FileUtil.checkSize(properties.getMaxSize(), multipartFile.getSize()); + String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename()); + String type = FileUtil.getFileType(suffix); + File file = FileUtil.upload(multipartFile, properties.getPath().getPath() + type + File.separator); + if(ObjectUtil.isNull(file)){ + throw new BadRequestException("上传失败"); + } + try { + Long userId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + name = StrUtil.isEmpty(name) ? FileUtil.getFileNameNoEx(multipartFile.getOriginalFilename()) : name; + JSONObject localStorage = new JSONObject(); + localStorage.put("storage_id", IdUtil.getSnowflake(1,1).nextId()); + localStorage.put("real_name", file.getName()); + localStorage.put("name", name); + localStorage.put("suffix", suffix); + localStorage.put("path", file.getPath()); + localStorage.put("type", type); + localStorage.put("size", FileUtil.getSize(multipartFile.getSize())); + localStorage.put("create_id", userId); + localStorage.put("update_optid", userId); + localStorage.put("create_name", nickName); + localStorage.put("update_optname", nickName); + localStorage.put("create_time", now); + localStorage.put("update_time", now); + +// LocalStorage localStorage = new LocalStorage( +// file.getName(), +// name, +// suffix, +// file.getPath(), +// type, +// FileUtil.getSize(multipartFile.getSize()) +// ); +// JSONObject json = JSONObject.parseObject(JSON.toJSONString(localStorage)); + toolTab.insert(localStorage); + return localStorage; + }catch (Exception e){ + FileUtil.del(file); + throw e; + } + } + + /** + * 编辑 + * + * @param resources 文件信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void update(LocalStorage resources) { + JSONObject entity = this.findById(resources.getCreate_id()); + if (ObjectUtil.isEmpty(entity)) throw new BadRequestException("文件信息不存在"); + WQLObject toolTab = WQLObject.getWQLObject("tool_local_storage"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(resources)); + toolTab.update(json); + } + + /** + * 通过id找文件信息 + * + * @param id + * @return + */ + @Override + public JSONObject findById(String id) { + WQLObject toolTab = WQLObject.getWQLObject("tool_local_storage"); + JSONObject object = toolTab.query("storage_id = '" + id + "'").uniqueResult(0); + return object; + } + + /** + * 多选删除 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject toolTab = WQLObject.getWQLObject("tool_local_storage"); + for (Long id : ids) { + JSONObject storage = this.findById(id.toString()); + if (ObjectUtil.isEmpty(storage)) continue; + FileUtil.del(storage.getString("path")); + toolTab.delete(storage); + } + } +} diff --git a/nladmin-ui/src/views/generator/config.vue b/nladmin-ui/src/views/generator/config.vue index f90dc99..8f45604 100644 --- a/nladmin-ui/src/views/generator/config.vue +++ b/nladmin-ui/src/views/generator/config.vue @@ -46,7 +46,8 @@ + false-label="0" + /> @@ -54,7 +55,8 @@ + false-label="0" + /> @@ -62,7 +64,8 @@ + false-label="0" + /> @@ -247,6 +250,7 @@ export default { this.$nextTick(() => { this.init() get(this.tableName).then(data => { + console.log(data) this.form = data this.form.cover = this.form.cover.toString() }) diff --git a/nladmin-ui/src/views/system/timing/index.vue b/nladmin-ui/src/views/system/timing/index.vue index 6317f79..755b71a 100644 --- a/nladmin-ui/src/views/system/timing/index.vue +++ b/nladmin-ui/src/views/system/timing/index.vue @@ -100,8 +100,8 @@