소스 검색

feat(file): 添加文件管理功能并集成到相关模块

- 新增 FileManage 模型和相关服务接口、实现类
- 在 BasicInfo、NewsUpdates、ProductCenter、QualificationCertificate 等模块中集成文件上传功能
- 优化荣誉资质模块,支持多文件上传
- 更新应用配置,添加文件服务器相关设置
林仔 8 달 전
부모
커밋
338c498c26
21개의 변경된 파일682개의 추가작업 그리고 60개의 파일을 삭제
  1. 24 0
      zksy-admin/src/main/java/com/zksy/web/controller/base/BasicInfoController.java
  2. 104 0
      zksy-admin/src/main/java/com/zksy/web/controller/base/FileManageController.java
  3. 16 0
      zksy-admin/src/main/java/com/zksy/web/controller/base/NewsUpdatesController.java
  4. 16 0
      zksy-admin/src/main/java/com/zksy/web/controller/base/ProductCenterController.java
  5. 9 10
      zksy-admin/src/main/java/com/zksy/web/controller/base/QualificationCertificateController.java
  6. 16 0
      zksy-admin/src/main/java/com/zksy/web/controller/base/SolutionController.java
  7. 20 8
      zksy-admin/src/main/java/com/zksy/web/controller/system/SysLoginController.java
  8. 8 12
      zksy-admin/src/main/java/com/zksy/web/core/config/SwaggerConfig.java
  9. 19 3
      zksy-admin/src/main/resources/application.yml
  10. 38 12
      zksy-framework/src/main/java/com/zksy/framework/web/service/SysLoginService.java
  11. 9 1
      zksy-system/src/main/java/com/zksy/base/domain/BasicInfo.java
  12. 5 4
      zksy-system/src/main/java/com/zksy/base/domain/FileManage.java
  13. 6 1
      zksy-system/src/main/java/com/zksy/base/domain/NewsUpdates.java
  14. 6 1
      zksy-system/src/main/java/com/zksy/base/domain/ProductCenter.java
  15. 10 1
      zksy-system/src/main/java/com/zksy/base/domain/QualificationCertificate.java
  16. 6 1
      zksy-system/src/main/java/com/zksy/base/domain/Solution.java
  17. 42 1
      zksy-system/src/main/java/com/zksy/base/service/FileManageService.java
  18. 12 1
      zksy-system/src/main/java/com/zksy/base/service/QualificationCertificateService.java
  19. 238 1
      zksy-system/src/main/java/com/zksy/base/service/impl/FileManageServiceImpl.java
  20. 76 1
      zksy-system/src/main/java/com/zksy/base/service/impl/QualificationCertificateServiceImpl.java
  21. 2 2
      zksy-system/src/main/resources/mapper/base/FileManageMapper.xml

+ 24 - 0
zksy-admin/src/main/java/com/zksy/web/controller/base/BasicInfoController.java

@@ -3,11 +3,13 @@ package com.zksy.web.controller.base;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.BasicInfo;
 import com.zksy.base.service.BasicInfoService;
+import com.zksy.base.service.FileManageService;
 import com.zksy.common.core.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -26,6 +28,8 @@ import java.util.Arrays;
 public class BasicInfoController {
     @Autowired
     private BasicInfoService service;
+    @Autowired
+    private FileManageService fileManageService;
 
     @GetMapping("/findByPage")
     @ApiOperation(value = "首页信息查询分页")
@@ -46,18 +50,38 @@ public class BasicInfoController {
     }
     @PostMapping("/save")
     @ApiOperation(value = "首页信息保存")
+    @Transactional
     public AjaxResult save(@RequestBody BasicInfo entity) {
+        if(!entity.getCompanyProMultipartFile().isEmpty()) {
+            String companyProfilePath = fileManageService.uploadFilePath(entity.getCompanyProMultipartFile());
+            entity.setCompanyProfileUrl(companyProfilePath);
+        }
+        if(!entity.getQrCodeMultipartFile().isEmpty()){
+            String qrCodeMultipartFilePath = fileManageService.uploadFilePath(entity.getQrCodeMultipartFile());
+            entity.setQrCodeUrl(qrCodeMultipartFilePath);
+        }
         return service.save(entity) ? AjaxResult.success(entity): AjaxResult.error("保存失败");
     }
     @PostMapping("/update")
     @ApiOperation(value = "首页信息修改")
+    @Transactional
     public AjaxResult update(@RequestBody BasicInfo entity) {
+        if(!entity.getCompanyProMultipartFile().isEmpty()) {
+            String companyProfilePath = fileManageService.uploadFilePath(entity.getCompanyProMultipartFile());
+            entity.setCompanyProfileUrl(companyProfilePath);
+        }
+        if(!entity.getQrCodeMultipartFile().isEmpty()){
+            String qrCodeMultipartFilePath = fileManageService.uploadFilePath(entity.getQrCodeMultipartFile());
+            entity.setQrCodeUrl(qrCodeMultipartFilePath);
+        }
         entity.setUpdateTime(LocalDateTime.now());
         return service.updateById(entity) ? AjaxResult.success(entity): AjaxResult.error("修改失败");
     }
     @PostMapping("/deleteBatch")
     @ApiOperation(value = "首页信息删除")
+    @Transactional
     public AjaxResult delete(@RequestBody String[] ids) {
+        fileManageService.deleteFileByFids(Arrays.asList(ids));
         return service.removeByIds(Arrays.asList(ids)) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
     }
 }

+ 104 - 0
zksy-admin/src/main/java/com/zksy/web/controller/base/FileManageController.java

@@ -0,0 +1,104 @@
+package com.zksy.web.controller.base;
+
+import com.zksy.base.service.FileManageService;
+import com.zksy.common.config.ZksyConfig;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.utils.StringUtils;
+import com.zksy.common.utils.file.FileUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @version 1.0
+ * @project zksy-website-service
+ * @description 文件管理
+ * @date 2025/9/11 11:36:14
+ */
+@Slf4j
+@RestController
+@Api(tags = "文件管理",description = "文件管理desc")
+public class FileManageController {
+
+    @Autowired
+    private FileManageService service;
+
+    /**
+     * 文件上传(单个)
+     */
+    @PostMapping("/uploadFile")
+    @ApiOperation("文件上传(单个)")
+    public AjaxResult uploadFile(@ApiParam(value = "文件",required = true) @RequestParam(value = "file") MultipartFile multipartFile,
+                                 @ApiParam(value = "父id") @RequestParam(value = "fid",defaultValue = "0") String fid,
+                                 @ApiParam(value = "模块名称",required = true) @RequestParam(value = "moduleName") String moduleName) {
+        return service.uploadFile(multipartFile,fid,moduleName);
+    }
+
+    /**
+     * 文件上传(返回文件地址)
+     */
+    @PostMapping("/uploadFilePath")
+    @ApiOperation("文件上传(返回文件地址)")
+    public String uploadFilePath(@ApiParam(value = "文件",required = true) @RequestParam(value = "file")MultipartFile multipartFile) {
+        return service.uploadFilePath(multipartFile);
+    }
+
+    /**
+     * 文件上传(多个)
+     */
+    @PostMapping("/uploadFiles")
+    @ApiOperation("文件上传(多个)")
+    public AjaxResult uploadFiles(@ApiParam(value = "文件",required = true) @RequestParam(value = "file") List<MultipartFile> multipartFiles,
+                                  @ApiParam(value = "父id",required = false) @RequestParam(value = "fid",defaultValue = "0") String fid,
+                                  @ApiParam(value = "模块名称",required = true) @RequestParam(value = "moduleName") String moduleName) {
+        return service.uploadListFile(multipartFiles,fid,moduleName);
+    }
+    /**
+     * 通用下载请求
+     *
+     * @param fileName 文件名称
+     */
+    @GetMapping("/download")
+    @ApiOperation(value = "通用下载请求", notes = "通用下载请求")
+    public void fileDownload(String fileName, HttpServletResponse response) {
+        try {
+            if (!FileUtils.checkAllowDownload(fileName)) {
+                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
+            }
+            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
+            String filePath = ZksyConfig.getDownloadPath() + fileName;
+
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, realFileName);
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+    /**
+     * 删除信息
+     */
+    @GetMapping("/deleteFileById")
+    @ApiOperation("根据id删除文件信息")
+    public AjaxResult deleteFileById(@ApiParam(value = "文件id",required = true) @RequestParam(value = "id") String id) {
+        return service.deleteFile(id);
+    }
+
+    @GetMapping("/deleteFileByFids")
+    @ApiOperation("根据父ID删除文件")
+    public AjaxResult deleteFileByFids(@ApiParam(value = "文件id",required = true) @RequestParam(value = "fid") List<String> fids){
+        return service.deleteFileByFids(fids);
+    }
+}

+ 16 - 0
zksy-admin/src/main/java/com/zksy/web/controller/base/NewsUpdatesController.java

@@ -2,12 +2,14 @@ package com.zksy.web.controller.base;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.NewsUpdates;
+import com.zksy.base.service.FileManageService;
 import com.zksy.base.service.NewsUpdatesService;
 import com.zksy.common.core.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -26,6 +28,8 @@ import java.util.Arrays;
 public class NewsUpdatesController {
     @Autowired
     private NewsUpdatesService service;
+    @Autowired
+    private FileManageService fileManageService;
 
     @GetMapping("/findByPage")
     @ApiOperation(value = "新闻动态查询分页")
@@ -46,18 +50,30 @@ public class NewsUpdatesController {
     }
     @PostMapping("/save")
     @ApiOperation(value = "新闻动态保存")
+    @Transactional
     public AjaxResult save(@RequestBody NewsUpdates entity) {
+        if(entity.getNewsMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getNewsMultipartFile());
+            entity.setNewsUrl(filePath);
+        }
         return service.save(entity) ? AjaxResult.success(entity): AjaxResult.error("保存失败");
     }
     @PostMapping("/update")
     @ApiOperation(value = "新闻动态修改")
+    @Transactional
     public AjaxResult update(@RequestBody NewsUpdates entity) {
+        if(entity.getNewsMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getNewsMultipartFile());
+            entity.setNewsUrl(filePath);
+        }
         entity.setUpdateTime(LocalDateTime.now());
         return service.updateById(entity) ? AjaxResult.success(entity): AjaxResult.error("修改失败");
     }
     @PostMapping("/deleteBatch")
     @ApiOperation(value = "新闻动态删除")
+    @Transactional
     public AjaxResult delete(@RequestBody String[] ids) {
+        fileManageService.deleteFileByFids(Arrays.asList(ids));
         return service.removeByIds(Arrays.asList(ids)) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
     }
 }

+ 16 - 0
zksy-admin/src/main/java/com/zksy/web/controller/base/ProductCenterController.java

@@ -2,12 +2,14 @@ package com.zksy.web.controller.base;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.ProductCenter;
+import com.zksy.base.service.FileManageService;
 import com.zksy.base.service.ProductCenterService;
 import com.zksy.common.core.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -26,6 +28,8 @@ import java.util.Arrays;
 public class ProductCenterController {
     @Autowired
     private ProductCenterService service;
+    @Autowired
+    private FileManageService fileManageService;
 
     @GetMapping("/findByPage")
     @ApiOperation(value = "产品中心查询分页")
@@ -46,18 +50,30 @@ public class ProductCenterController {
     }
     @PostMapping("/save")
     @ApiOperation(value = "产品中心保存")
+    @Transactional
     public AjaxResult save(@RequestBody ProductCenter entity) {
+        if(entity.getProductMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getProductMultipartFile());
+            entity.setProductUrl(filePath);
+        }
         return service.save(entity) ? AjaxResult.success(entity): AjaxResult.error("保存失败");
     }
     @PostMapping("/update")
     @ApiOperation(value = "产品中心修改")
+    @Transactional
     public AjaxResult update(@RequestBody ProductCenter entity) {
+        if(entity.getProductMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getProductMultipartFile());
+            entity.setProductUrl(filePath);
+        }
         entity.setUpdateTime(LocalDateTime.now());
         return service.updateById(entity) ? AjaxResult.success(entity): AjaxResult.error("修改失败");
     }
     @PostMapping("/deleteBatch")
     @ApiOperation(value = "产品中心删除")
+    @Transactional
     public AjaxResult delete(@RequestBody String[] ids) {
+        fileManageService.deleteFileByFids(Arrays.asList(ids));
         return service.removeByIds(Arrays.asList(ids)) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
     }
 }

+ 9 - 10
zksy-admin/src/main/java/com/zksy/web/controller/base/QualificationCertificateController.java

@@ -1,8 +1,8 @@
 package com.zksy.web.controller.base;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.QualificationCertificate;
 import com.zksy.base.service.QualificationCertificateService;
+import com.zksy.common.annotation.Anonymous;
 import com.zksy.common.core.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -10,7 +10,6 @@ import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.time.LocalDateTime;
 import java.util.Arrays;
 
 /**
@@ -31,33 +30,33 @@ public class QualificationCertificateController {
     @ApiOperation(value = "荣誉资质查询分页")
     public AjaxResult findByPage(@ApiParam(value = "页码", required = true)long pageNum,
                                  @ApiParam(value = "页数", required = true)long pageSize){
-        Page<QualificationCertificate> page = new Page<>(pageNum, pageSize);
-        return AjaxResult.success(service.page(page));
+        return AjaxResult.success(service.pageQualificationCertificate(pageNum, pageSize));
     }
     @GetMapping("/getQualificationCertificateList")
     @ApiOperation(value = "荣誉资质查询")
     public AjaxResult getQualificationCertificateList(){
-        return AjaxResult.success(service.list());
+        return AjaxResult.success(service.listQualificationCertificate());
     }
     @GetMapping("/getById/{id}")
     @ApiOperation(value = "根据Id查询荣誉资质")
     public AjaxResult getById(@PathVariable String id){
-        return AjaxResult.success(service.getById(id));
+        return AjaxResult.success(service.getQualificationCertificateById(id));
     }
+
     @PostMapping("/save")
     @ApiOperation(value = "荣誉资质保存")
+    @Anonymous
     public AjaxResult save(@RequestBody QualificationCertificate entity) {
-        return service.save(entity) ? AjaxResult.success(entity): AjaxResult.error("保存失败");
+        return AjaxResult.success(service.saveQualificationCertificate( entity));
     }
     @PostMapping("/update")
     @ApiOperation(value = "荣誉资质修改")
     public AjaxResult update(@RequestBody QualificationCertificate entity) {
-        entity.setUpdateTime(LocalDateTime.now());
-        return service.updateById(entity) ? AjaxResult.success(entity): AjaxResult.error("修改失败");
+        return AjaxResult.success(service.updateQualificationCertificate(entity));
     }
     @PostMapping("/deleteBatch")
     @ApiOperation(value = "荣誉资质删除")
     public AjaxResult delete(@RequestBody String[] ids) {
-        return service.removeByIds(Arrays.asList(ids)) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+        return AjaxResult.success(service.removeQualificationCertificateByIds(Arrays.asList(ids)));
     }
 }

+ 16 - 0
zksy-admin/src/main/java/com/zksy/web/controller/base/SolutionController.java

@@ -2,12 +2,14 @@ package com.zksy.web.controller.base;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.Solution;
+import com.zksy.base.service.FileManageService;
 import com.zksy.base.service.SolutionService;
 import com.zksy.common.core.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -26,6 +28,8 @@ import java.util.Arrays;
 public class SolutionController {
     @Autowired
     private SolutionService service;
+    @Autowired
+    private FileManageService fileManageService;
 
     @GetMapping("/findByPage")
     @ApiOperation(value = "解决方案查询分页")
@@ -46,18 +50,30 @@ public class SolutionController {
     }
     @PostMapping("/save")
     @ApiOperation(value = "解决方案保存")
+    @Transactional
     public AjaxResult save(@RequestBody Solution entity) {
+        if(entity.getSolutionMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getSolutionMultipartFile());
+            entity.setProductUrl(filePath);
+        }
         return service.save(entity) ? AjaxResult.success(entity): AjaxResult.error("保存失败");
     }
     @PostMapping("/update")
     @ApiOperation(value = "解决方案修改")
+    @Transactional
     public AjaxResult update(@RequestBody Solution entity) {
+        if(entity.getSolutionMultipartFile() != null){
+            String filePath = fileManageService.uploadFilePath(entity.getSolutionMultipartFile());
+            entity.setProductUrl(filePath);
+        }
         entity.setUpdateTime(LocalDateTime.now());
         return service.updateById(entity) ? AjaxResult.success(entity): AjaxResult.error("修改失败");
     }
     @PostMapping("/deleteBatch")
     @ApiOperation(value = "解决方案删除")
+    @Transactional
     public AjaxResult delete(@RequestBody String[] ids) {
+        fileManageService.deleteFileByFids(Arrays.asList(ids));
         return service.removeByIds(Arrays.asList(ids)) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
     }
 }

+ 20 - 8
zksy-admin/src/main/java/com/zksy/web/controller/system/SysLoginController.java

@@ -1,13 +1,5 @@
 package com.zksy.web.controller.system;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
 import com.zksy.common.constant.Constants;
 import com.zksy.common.core.domain.AjaxResult;
 import com.zksy.common.core.domain.entity.SysMenu;
@@ -23,6 +15,16 @@ import com.zksy.framework.web.service.SysPermissionService;
 import com.zksy.framework.web.service.TokenService;
 import com.zksy.system.service.ISysConfigService;
 import com.zksy.system.service.ISysMenuService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 登录验证
@@ -128,4 +130,14 @@ public class SysLoginController
         }
         return false;
     }
+    @ApiOperation(value = "用户不需要验证码登录")
+    @PostMapping("/loginNoCode")
+    public AjaxResult loginNoCode(@RequestBody LoginBody loginBody) {
+        AjaxResult ajax = AjaxResult.success();
+        // 生成令牌
+        String token = loginService.loginNoCode(loginBody.getUsername(), loginBody.getPassword(),
+                loginBody.getUuid());
+        ajax.put(Constants.TOKEN, token);
+        return ajax;
+    }
 }

+ 8 - 12
zksy-admin/src/main/java/com/zksy/web/core/config/SwaggerConfig.java

@@ -1,27 +1,23 @@
 package com.zksy.web.core.config;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.zksy.common.config.ZksyConfig;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import com.zksy.common.config.ZksyConfig;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.ApiKey;
-import springfox.documentation.service.AuthorizationScope;
-import springfox.documentation.service.Contact;
-import springfox.documentation.service.SecurityReference;
-import springfox.documentation.service.SecurityScheme;
+import springfox.documentation.service.*;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Swagger2的接口配置
  * 
@@ -63,7 +59,7 @@ public class SwaggerConfig
                 .paths(PathSelectors.any())
                 .build()
                 /* 设置安全模式,swagger可以设置访问token */
-                .securitySchemes(securitySchemes())
+//                .securitySchemes(securitySchemes())
                 .securityContexts(securityContexts())
                 .pathMapping(pathMapping);
     }

+ 19 - 3
zksy-admin/src/main/resources/application.yml

@@ -7,7 +7,7 @@ zksy:
   # 版权年份
   copyrightYear: 2025
   # 文件路径 示例( Windows配置D:/zksy/uploadPath,Linux配置 /home/zksy/uploadPath)
-  profile: D:/zksy/uploadPath
+  profile: D:/zksy/uploadPath/website
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
@@ -111,13 +111,23 @@ pagehelper:
   helperDialect: mysql
   supportMethodsArguments: true
   params: count=countSql
+## 文件上传配置
+local:
+  fileserver:
+    path: file:D:/zksy/uploadPath/website/
+    upload:
+      path: D:/zksy/uploadPath/website/
+    baseurl:
+    mapping:
+      path: /profile/zksy/website/
+    filetypes: .jpg,.gif,.png,.ico,.bmp,.jpeg,.mp4,.xls,.xlsx,.tif,.pcx,.tga,.exif,.fpx,.svg,.psd,.cdr,.pcd,.dib,.jfif,.jpe,.dxf,.ufo,.eps,.ai,.raw,.et,.WMF,.webp,.avi,.rmvb,.prn,.wps,.vsd,.dps,.avif,.apng,.doc,.docx,.txt,.pdf,.ppt,.exe,.pptx,.rft,.rar,.zip,.dat,.key,.msg,.cad,.btw,
 
 # Swagger配置
 swagger:
   # 是否开启swagger
   enabled: true
   # 请求前缀
-  pathMapping: /dev-api
+  pathMapping: /
 
 # 防盗链配置
 referer:
@@ -138,4 +148,10 @@ knife4j:
   enable: true
   production: false
   basic:
-    enable: false
+    enable: false
+  group:
+    default:
+      group-name: default
+      api-rule: package
+      api-rule-resources:
+        - com.zksy.web.controller

+ 38 - 12
zksy-framework/src/main/java/com/zksy/framework/web/service/SysLoginService.java

@@ -1,23 +1,12 @@
 package com.zksy.framework.web.service;
 
-import javax.annotation.Resource;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.stereotype.Component;
 import com.zksy.common.constant.CacheConstants;
 import com.zksy.common.constant.Constants;
 import com.zksy.common.constant.UserConstants;
 import com.zksy.common.core.domain.model.LoginUser;
 import com.zksy.common.core.redis.RedisCache;
 import com.zksy.common.exception.ServiceException;
-import com.zksy.common.exception.user.BlackListException;
-import com.zksy.common.exception.user.CaptchaException;
-import com.zksy.common.exception.user.CaptchaExpireException;
-import com.zksy.common.exception.user.UserNotExistsException;
-import com.zksy.common.exception.user.UserPasswordNotMatchException;
+import com.zksy.common.exception.user.*;
 import com.zksy.common.utils.DateUtils;
 import com.zksy.common.utils.MessageUtils;
 import com.zksy.common.utils.StringUtils;
@@ -27,6 +16,14 @@ import com.zksy.framework.manager.factory.AsyncFactory;
 import com.zksy.framework.security.context.AuthenticationContextHolder;
 import com.zksy.system.service.ISysConfigService;
 import com.zksy.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
 
 /**
  * 登录校验方法
@@ -173,4 +170,33 @@ public class SysLoginService
     {
         userService.updateLoginInfo(userId, IpUtils.getIpAddr(), DateUtils.getNowDate());
     }
+    /**
+     * 登录验证
+     *
+     * @param username 用户名
+     * @param password 密码
+     * @param uuid     唯一标识
+     * @return 结果
+     */
+    public String loginNoCode(String username, String password, String uuid) {
+        // 用户验证
+        Authentication authentication = null;
+        try {
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
+        } catch (Exception e) {
+            if (e instanceof BadCredentialsException) {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            } else {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        recordLoginInfo(loginUser.getUserId());
+        // 生成token
+        return tokenService.createToken(loginUser);
+    }
 }

+ 9 - 1
zksy-system/src/main/java/com/zksy/base/domain/BasicInfo.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
 
 /**
  * 首页基础信息
@@ -33,6 +35,9 @@ public class BasicInfo implements Serializable {
     @TableField(value = "company_profile_url")
     private String companyProfileUrl;
 
+    @TableField(exist = false)
+    private MultipartFile companyProMultipartFile;
+
     /**
      * 软件简介
      */
@@ -81,6 +86,9 @@ public class BasicInfo implements Serializable {
     @TableField(value = "qr_code_url")
     private String qrCodeUrl;
 
+    @TableField(exist = false)
+    private MultipartFile qrCodeMultipartFile;
+
     /**
      * 创建人
      */

+ 5 - 4
zksy-system/src/main/java/com/zksy/base/domain/FileManage.java

@@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
 
 /**
  * 文件管理
@@ -19,13 +20,13 @@ public class FileManage implements Serializable {
      * 主键
      */
     @TableId(value = "id", type = IdType.ASSIGN_UUID)
-    private Long id;
+    private String id;
 
     /**
      * 父id
      */
     @TableField(value = "fid")
-    private Long fid;
+    private String fid;
 
     /**
      * 模块名称
@@ -55,7 +56,7 @@ public class FileManage implements Serializable {
      * 文件大小
      */
     @TableField(value = "file_size")
-    private Double fileSize;
+    private Long fileSize;
 
     /**
      * 创建人

+ 6 - 1
zksy-system/src/main/java/com/zksy/base/domain/NewsUpdates.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
 
 /**
  * 新闻动态
@@ -39,6 +41,9 @@ public class NewsUpdates implements Serializable {
     @TableField(value = "news_url")
     private String newsUrl;
 
+    @TableField(exist = false)
+    private MultipartFile newsMultipartFile;
+
     /**
      * 创建人
      */

+ 6 - 1
zksy-system/src/main/java/com/zksy/base/domain/ProductCenter.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
 
 /**
  * 产品中心
@@ -51,6 +53,9 @@ public class ProductCenter implements Serializable {
     @TableField(value = "product_url")
     private String productUrl;
 
+    @TableField(exist = false)
+    private MultipartFile productMultipartFile;
+
     /**
      * 创建人
      */

+ 10 - 1
zksy-system/src/main/java/com/zksy/base/domain/QualificationCertificate.java

@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
+import java.util.List;
 
 /**
  * 荣誉资质
@@ -51,6 +54,12 @@ public class QualificationCertificate implements Serializable {
     @TableField(value = "update_time")
     private LocalDateTime updateTime;
 
+    @TableField(exist = false)
+    private List<String> fileList;
+
+    @TableField(exist = false)
+    private MultipartFile[] multipartFile;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 6 - 1
zksy-system/src/main/java/com/zksy/base/domain/Solution.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import lombok.Data;
 
 /**
  * 解决方案
@@ -39,6 +41,9 @@ public class Solution implements Serializable {
     @TableField(value = "product_url")
     private String productUrl;
 
+    @TableField(exist = false)
+    private MultipartFile solutionMultipartFile;
+
     /**
      * 创建人
      */

+ 42 - 1
zksy-system/src/main/java/com/zksy/base/service/FileManageService.java

@@ -1,7 +1,11 @@
 package com.zksy.base.service;
 
-import com.zksy.base.domain.FileManage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.FileManage;
+import com.zksy.common.core.domain.AjaxResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -10,4 +14,41 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface FileManageService extends IService<FileManage> {
 
+    /**
+     * TODO 文件上传(单个)
+     * @param multipartFile
+     * @return com.dhcc.basic.util.Message<java.lang.String>
+     * @author Administrator
+     * @date 2024/1/24 15:44:54
+     */
+    AjaxResult uploadFile(MultipartFile multipartFile, String fid, String moduleName);
+
+    /**
+     * TODO 文件上传(返回文件地址)
+     * @param multipartFile
+     * @return java.lang.String
+     * @author Administrator
+     * @date 2024/4/23 16:52:32
+     */
+    String uploadFilePath(MultipartFile multipartFile);
+
+    /**
+     * TODO 文件批量上传
+     * @param multipartFiles
+     * @return com.dhcc.basic.util.Message<java.lang.String>
+     * @author Administrator
+     * @date 2024/1/24 15:44:54
+     */
+    AjaxResult uploadListFile(List<MultipartFile> multipartFiles, String fid, String moduleName);
+
+    /**
+     * 删除文件
+     * @param id
+     * @return
+     */
+    AjaxResult deleteFile(String id);
+
+    List<String> listFileByFid(String id);
+
+    AjaxResult deleteFileByFids(List<String> fids);
 }

+ 12 - 1
zksy-system/src/main/java/com/zksy/base/service/QualificationCertificateService.java

@@ -1,7 +1,10 @@
 package com.zksy.base.service;
 
-import com.zksy.base.domain.QualificationCertificate;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.QualificationCertificate;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -9,5 +12,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
 * @createDate 2025-09-08 08:57:08
 */
 public interface QualificationCertificateService extends IService<QualificationCertificate> {
+    Page<QualificationCertificate> pageQualificationCertificate(Long pageNum,Long pageSize);
+
+    List<QualificationCertificate> listQualificationCertificate();
+    QualificationCertificate getQualificationCertificateById(String  id);
+
+    QualificationCertificate saveQualificationCertificate(QualificationCertificate entity);
+    QualificationCertificate updateQualificationCertificate(QualificationCertificate entity);
+    boolean removeQualificationCertificateByIds(List<String> ids);
 
 }

+ 238 - 1
zksy-system/src/main/java/com/zksy/base/service/impl/FileManageServiceImpl.java

@@ -1,20 +1,257 @@
 package com.zksy.base.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.base.domain.FileManage;
-import com.zksy.base.service.FileManageService;
 import com.zksy.base.mapper.FileManageMapper;
+import com.zksy.base.service.FileManageService;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.exception.ServiceException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
 * @author Administrator
 * @description 针对表【file_manage(文件管理)】的数据库操作Service实现
 * @createDate 2025-09-08 08:57:08
 */
+@Slf4j
 @Service
 public class FileManageServiceImpl extends ServiceImpl<FileManageMapper, FileManage>
     implements FileManageService{
 
+    @Value("${local.fileserver.filetypes}")
+    private String allowFileTypes;
+
+    @Value("${local.fileserver.upload.path}")
+    private String localFileServerUploadDir;
+
+    @Value("${local.fileserver.baseurl}")
+    private String localFileServerBaseUrl;
+
+    @Value("${local.fileserver.mapping.path}")
+    private String localFileServerMappingPath;
+
+    @Autowired
+    private FileManageMapper mapper;
+
+    @Override
+    public AjaxResult uploadFile(MultipartFile multipartFile, String fid, String moduleName) {
+        try {
+            // 获取文件名
+            String fileOriginalName = multipartFile.getOriginalFilename();
+            //获取文件大小
+            Long fileSize = multipartFile.getSize();
+            String fileName = UUID.randomUUID().toString() + fileOriginalName.substring(fileOriginalName.lastIndexOf("."), fileOriginalName.length());
+
+            log.info("(加个时间戳,尽量避免文件名称重复)保存的文件名为: " + fileName + "\n");
+            //加个时间戳,尽量避免文件名称重复
+            String path = localFileServerUploadDir + fileName;
+            //文件绝对路径
+            log.info("保存文件绝对路径" + path + "\n");
+            //创建文件路径
+            File dest = new File(path);
+            //判断文件是否已经存在
+            if (dest.exists()) {
+                return AjaxResult.error("文件已存在");
+            }
+            //判断文件父目录是否存在
+            if (!dest.getParentFile().exists()) {
+                dest.getParentFile().mkdir();
+            }
+            //上传文件
+            multipartFile.transferTo(dest); //保存文件
+            log.info("保存文件路径" + path + "\n");
+            //url="http://你自己的域名/项目名/images/"+fileName;//正式项目
+//            String url = localFileServerBaseUrl + serverContextPath + localFileServerMappingPath +"/" + fileName;
+            String url = localFileServerMappingPath + "/" + fileName;
+
+            //log.info("保存的完整url====" + url + "\n");
+            FileManage uploadRes = new FileManage();
+            uploadRes.setId(UUID.randomUUID().toString());
+            uploadRes.setFid(fid);
+            uploadRes.setFileOriginalName(fileOriginalName);
+            uploadRes.setFileUrl(url);
+            uploadRes.setFileName(fileName);
+            uploadRes.setFileSize(fileSize);
+            uploadRes.setCreateTime(LocalDateTime.now());
+            uploadRes.setCreateBy("管理员");
+            uploadRes.setModuleName(moduleName);
+            mapper.insert(uploadRes);
+            return AjaxResult.success("文件上传成功",uploadRes);
+        } catch (IOException e) {
+            log.error("文件上传异常!");
+            log.error(ExceptionUtils.getStackTrace(e));
+            return AjaxResult.error("文件上传失败");
+        }
+    }
+
+    @Override
+    public String uploadFilePath(MultipartFile multipartFile) {
+        String url = "";
+        try {
+            // 获取文件名
+            String fileOriginalName = multipartFile.getOriginalFilename();
+            //获取文件大小
+            Long fileSize = multipartFile.getSize();
+            String fileName = UUID.randomUUID().toString() + fileOriginalName.substring(fileOriginalName.lastIndexOf("."), fileOriginalName.length());
+
+            log.info("(加个时间戳,尽量避免文件名称重复)保存的文件名为: " + fileName + "\n");
+            //加个时间戳,尽量避免文件名称重复
+            String path = localFileServerUploadDir + fileName;
+            //文件绝对路径
+            log.info("保存文件绝对路径" + path + "\n");
+            //创建文件路径
+            File dest = new File(path);
+            //判断文件是否已经存在
+            if (dest.exists()) {
+                throw new ServiceException("文件已存在");
+            }
+            //判断文件父目录是否存在
+            if (!dest.getParentFile().exists()) {
+                dest.getParentFile().mkdir();
+            }
+            //上传文件
+            multipartFile.transferTo(dest); //保存文件
+            log.info("保存文件路径" + path + "\n");
+            //url="http://你自己的域名/项目名/images/"+fileName;//正式项目
+//            String url = localFileServerBaseUrl + serverContextPath + localFileServerMappingPath +"/" + fileName;
+            url = localFileServerMappingPath + "/" + fileName;
+
+        }catch (IOException e){
+            log.error("文件上传异常!");
+            log.error(ExceptionUtils.getStackTrace(e));
+        }
+        return url;
+    }
+
+    @Override
+    public AjaxResult uploadListFile(List<MultipartFile> multipartFiles, String fid, String moduleName) {
+        try {
+            List<FileManage> FileManageList = new ArrayList<>();
+            if (multipartFiles.size() > 0) {
+                for (MultipartFile multipartFile : multipartFiles) {
+                    // 获取文件名
+                    String fileOriginalName = multipartFile.getOriginalFilename();
+                    //获取文件大小
+                    Long fileSize = multipartFile.getSize();
+                    String fileName = UUID.randomUUID().toString() + fileOriginalName.substring(fileOriginalName.lastIndexOf("."), fileOriginalName.length());
+
+                    log.info("(加个时间戳,尽量避免文件名称重复)保存的文件名为: " + fileName + "\n");
+                    //加个时间戳,尽量避免文件名称重复
+                    String path = localFileServerUploadDir + fileName;
+                    //文件绝对路径
+                    log.info("保存文件绝对路径" + path + "\n");
+                    //创建文件路径
+                    File dest = new File(path);
+                    //判断文件是否已经存在
+                    if (dest.exists()) {
+                        return AjaxResult.error("文件已存在");
+                    }
+                    //判断文件父目录是否存在
+                    if (!dest.getParentFile().exists()) {
+                        dest.getParentFile().mkdir();
+                    }
+                    //上传文件
+                    multipartFile.transferTo(dest); //保存文件
+                    log.info("保存文件路径" + path + "\n");
+                    //url="http://你自己的域名/项目名/images/"+fileName;//正式项目
+//            String url = localFileServerBaseUrl + serverContextPath + localFileServerMappingPath +"/" + fileName;
+                    String url = localFileServerMappingPath + "/" + fileName;
+
+                    //log.info("保存的完整url====" + url + "\n");
+                    FileManage uploadRes = new FileManage();
+                    uploadRes.setId(UUID.randomUUID().toString());
+                    uploadRes.setFid(fid);
+                    uploadRes.setFileOriginalName(fileOriginalName);
+                    uploadRes.setFileUrl(url);
+                    uploadRes.setFileName(fileName);
+                    uploadRes.setFileSize(fileSize);
+                    uploadRes.setCreateTime(LocalDateTime.now());
+                    uploadRes.setCreateBy("管理员");
+                    uploadRes.setModuleName(moduleName);
+                    mapper.insert(uploadRes);
+                    FileManageList.add(uploadRes);
+                }
+                return AjaxResult.success("文件上传成功",FileManageList);
+            } else {
+                return AjaxResult.error("无文件上传");
+            }
+        }catch (IOException e) {
+            log.error("文件上传异常!");
+            log.error(ExceptionUtils.getStackTrace(e));
+            return AjaxResult.error("文件上传异常");
+        }
+    }
+
+    @Override
+    public AjaxResult deleteFile(String id) {
+        FileManage fileUpload = mapper.selectById(id);
+        String filePath = localFileServerUploadDir+fileUpload.getFileName();
+        File file = new File(filePath);
+        if (file.exists()) {
+            boolean isDeleted = file.delete();
+            if (isDeleted) {
+                //删除数据库信息
+                mapper.deleteById(id);
+                return AjaxResult.success("文件已成功删除");
+            } else {
+                return AjaxResult.error("无法删除该文件");
+            }
+        } else {
+            return AjaxResult.error("指定的文件不存在");
+        }
+    }
+
+    @Override
+    public List<String> listFileByFid(String id) {
+        LambdaQueryWrapper<FileManage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(FileManage::getFid,id);
+        List<FileManage> list = this.list(wrapper);
+        List<String> collect = list.stream().map(FileManage::getFileUrl).collect(Collectors.toList());
+        return collect;
+    }
+    /**
+     * 批量删除文件优化版
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult deleteFileByFids(List<String> fids) {
+        if (Objects.isNull(fids) || fids.isEmpty()) {
+            return AjaxResult.error("删除失败:文件ID集合不能为空");
+        }
+        int deleteCount = 0;
+        try {
+            LambdaQueryWrapper<FileManage> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(FileManage::getFid, fids);
+            List<FileManage> fileList = list(queryWrapper);
+
+            if (!fileList.isEmpty()) {
+                for (FileManage file : fileList) {
+                    deleteFile(file.getId());
+                    deleteCount++;
+                }
+            }
+            return AjaxResult.success("删除成功", deleteCount);
+        } catch (Exception e) {
+            return AjaxResult.error("删除失败:" + e.getMessage());
+        }
+    }
+
 }
 
 

+ 76 - 1
zksy-system/src/main/java/com/zksy/base/service/impl/QualificationCertificateServiceImpl.java

@@ -1,10 +1,20 @@
 package com.zksy.base.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.base.domain.QualificationCertificate;
-import com.zksy.base.service.QualificationCertificateService;
 import com.zksy.base.mapper.QualificationCertificateMapper;
+import com.zksy.base.service.FileManageService;
+import com.zksy.base.service.QualificationCertificateService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
 
 /**
 * @author Administrator
@@ -14,7 +24,72 @@ import org.springframework.stereotype.Service;
 @Service
 public class QualificationCertificateServiceImpl extends ServiceImpl<QualificationCertificateMapper, QualificationCertificate>
     implements QualificationCertificateService{
+    @Autowired
+    private FileManageService fileManageService;
+
+    @Override
+    public Page<QualificationCertificate> pageQualificationCertificate(Long pageNum, Long pageSize) {
+        Page<QualificationCertificate> page = new Page<>(pageNum, pageSize);
+        if(page.getRecords() != null){
+            page.getRecords().forEach(item -> {
+                item.setFileList(fileManageService.listFileByFid(item.getId()));
+            });
+        }
+        LambdaQueryWrapper<QualificationCertificate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(QualificationCertificate::getUpdateTime);
+        return page(page,queryWrapper);
+    }
+
+    @Override
+    public List<QualificationCertificate> listQualificationCertificate() {
+        List<QualificationCertificate> list = list();
+        list.forEach(item -> {
+            item.setFileList(fileManageService.listFileByFid(item.getId()));
+        });
+        LambdaQueryWrapper<QualificationCertificate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(QualificationCertificate::getUpdateTime);
+        return list(queryWrapper);
+    }
+
+    @Override
+    public QualificationCertificate getQualificationCertificateById(String id) {
+        QualificationCertificate qualificationCertificate = getById(id);
+        if(qualificationCertificate != null){
+            qualificationCertificate.setFileList(fileManageService.listFileByFid(qualificationCertificate.getId()));
+            return qualificationCertificate;
+        }
+        return qualificationCertificate;
+    }
+
+    @Transactional
+    @Override
+    public QualificationCertificate saveQualificationCertificate(QualificationCertificate entity) {
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateTime(LocalDateTime.now());
+        save(entity);
+        if(entity.getMultipartFile() != null) {
+            fileManageService.uploadListFile(Arrays.asList(entity.getMultipartFile()), entity.getId(), "荣誉资质");
+        }
+        return entity;
+    }
+
+    @Transactional
+    @Override
+    public QualificationCertificate updateQualificationCertificate(QualificationCertificate entity) {
+        entity.setUpdateTime(LocalDateTime.now());
+        updateById(entity);
+        if(entity.getMultipartFile() != null) {
+            fileManageService.uploadListFile(Arrays.asList(entity.getMultipartFile()), entity.getId(), "荣誉资质");
+        }
+        return entity;
+    }
 
+    @Transactional
+    @Override
+    public boolean removeQualificationCertificateByIds(List<String> ids) {
+        fileManageService.deleteFileByFids(ids);
+        return removeByIds(ids);
+    }
 }
 
 

+ 2 - 2
zksy-system/src/main/resources/mapper/base/FileManageMapper.xml

@@ -5,8 +5,8 @@
 <mapper namespace="com.zksy.base.mapper.FileManageMapper">
 
     <resultMap id="BaseResultMap" type="com.zksy.base.domain.FileManage">
-            <id property="id" column="id" jdbcType="BIGINT"/>
-            <result property="fid" column="fid" jdbcType="BIGINT"/>
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="fid" column="fid" jdbcType="VARCHAR"/>
             <result property="moduleName" column="module_name" jdbcType="VARCHAR"/>
             <result property="fileOriginalName" column="file_original_name" jdbcType="VARCHAR"/>
             <result property="fileUrl" column="file_url" jdbcType="VARCHAR"/>