Kaynağa Gözat

Merge remote-tracking branch 'origin/feature-2022.07.29' into feature-2022.07.29

sakuya 3 yıl önce
ebeveyn
işleme
cebad9a20b

+ 55 - 48
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/BankController.java

@@ -1,6 +1,5 @@
 package me.zhengjie.application.admin.controller;
 
-
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,52 +27,60 @@ import me.zhengjie.application.admin.service.BankService;
 @RequestMapping("/bank")
 public class BankController {
 
-    @Autowired
-    private BankService bankService;
-
-
-    /**
-     * 银行 查询
-     *
-     * @return
-     */
-    @RequestMapping("/query")
-    public AppBaseResponse<List<BankQueryRsp>> queryBank(@RequestBody BankQueryReq req) {
-        return bankService.queryBank(req);
-    }
-
-    /**
-     * 银行 新增
-     *
-     * @return
-     */
-    @RequestMapping("/create")
-    public AppBaseResponse createBank(@RequestBody BankCreateReq req) {
-        return bankService.createBank(req);
-    }
-
-    /**
-     * 银行 编辑
-     *
-     * @return
-     */
-    @RequestMapping("/update")
-    public AppBaseResponse updateBank(@RequestBody BankCreateReq req) {
-        return bankService.updateBank(req);
-    }
-
-
-    /**
-     * 银行 删除
-     *
-     * @return
-     */
-    @RequestMapping("/delete")
-    public AppBaseResponse deleteBank(@RequestBody String[] ids) {
-        return bankService.deleteBank(ids);
-    }
-
-
+	@Autowired
+	private BankService bankService;
+
+	/**
+	 * 银行 查询
+	 *
+	 * @return
+	 */
+	@RequestMapping("/query")
+	public AppBaseResponse<List<BankQueryRsp>> queryBank(@RequestBody BankQueryReq req) {
+		return bankService.queryBank(req);
+	}
+
+	/**
+	 * 银行 查询
+	 *
+	 * @return
+	 */
+	@RequestMapping("/detail")
+	public AppBaseResponse<BankQueryRsp> detail(@RequestBody BankQueryReq req) {
+		AppBaseResponse<BankQueryRsp> response = new AppBaseResponse<>();
+		BankQueryRsp result = bankService.detail(req);
+		response.setResult(result);
+		return response;
+	}
+
+	/**
+	 * 银行 新增
+	 *
+	 * @return
+	 */
+	@RequestMapping("/create")
+	public AppBaseResponse createBank(@RequestBody BankCreateReq req) {
+		return bankService.createBank(req);
+	}
+
+	/**
+	 * 银行 编辑
+	 *
+	 * @return
+	 */
+	@RequestMapping("/update")
+	public AppBaseResponse updateBank(@RequestBody BankCreateReq req) {
+		return bankService.updateBank(req);
+	}
+
+	/**
+	 * 银行 删除
+	 *
+	 * @return
+	 */
+	@RequestMapping("/delete")
+	public AppBaseResponse deleteBank(@RequestBody String[] ids) {
+		return bankService.deleteBank(ids);
+	}
 
 }
-

+ 8 - 4
eladmin-system/src/main/java/me/zhengjie/application/admin/service/BankService.java

@@ -9,6 +9,8 @@ import me.zhengjie.application.admin.controller.vo.BankQueryRsp;
 
 import java.util.List;
 
+import org.springframework.web.bind.annotation.RequestBody;
+
 /**
  * <p>
  * 银行 服务类
@@ -19,11 +21,13 @@ import java.util.List;
  */
 public interface BankService extends IService<BankEntity> {
 
-    AppBaseResponse<List<BankQueryRsp>> queryBank(BankQueryReq req);
+	AppBaseResponse<List<BankQueryRsp>> queryBank(BankQueryReq req);
+
+	AppBaseResponse createBank(BankCreateReq req);
 
-    AppBaseResponse createBank(BankCreateReq req);
+	AppBaseResponse updateBank(BankCreateReq req);
 
-    AppBaseResponse updateBank(BankCreateReq req);
+	AppBaseResponse deleteBank(String[] array);
 
-    AppBaseResponse deleteBank(String[] array);
+	public BankQueryRsp detail(BankQueryReq req);
 }

+ 7 - 0
eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/BankServiceImpl.java

@@ -198,4 +198,11 @@ public class BankServiceImpl extends AbstractServiceImpl<BankMapper, BankEntity>
 			return false;
 		}
 	}
+
+	@Override
+	public BankQueryRsp detail(BankQueryReq req) {
+		BankEntity bankEntity = bankMapper.selectById(req.getId());
+		
+		return BeanCopyUtils.convertObj(bankEntity, BankQueryRsp.class);
+	}
 }

+ 129 - 124
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankNotarizeController.java

@@ -11,6 +11,7 @@ import me.zhengjie.base.ResponseDTO;
 import me.zhengjie.base.ResultCode;
 import me.zhengjie.base.config.TencentHumanFaceVerify;
 import me.zhengjie.base.util.FileUploadUtil;
+import me.zhengjie.base.util.UUIDGenerator;
 import me.zhengjie.base.util.tencent.h5face.SdkTest;
 import me.zhengjie.dao.mybatis.OrderFileRepository;
 import me.zhengjie.dao.mybatis.entity.OrderFileEntity;
@@ -26,128 +27,132 @@ import org.springframework.web.bind.annotation.RestController;
 @Slf4j
 @RequiredArgsConstructor
 public class BankNotarizeController {
-    private final OrderFileRepository orderFileRepository;
-    private final UserAXQInfoService userAXQInfoService;
-    private final BankNotarizeService bankNotarizeService;
-    private final TencentHumanFaceVerify faceVerify;
-
-    /**
-     * 获取签名公证书URL
-     *
-     * @param json
-     * @return
-     */
-    @RequestMapping("/getNotarization")
-    public ResponseDTO<?> getNotarization(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String businessNo = jsonObj.getString("businessNo");
-        if (StringUtils.isEmpty(businessNo)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        OrderFileEntity orderFile = orderFileRepository.getOrderNotarization(businessNo);
-        return ResponseDTO.success(FileUploadUtil.getPreviewUrl(orderFile.getSignedPdfUrl()));
-    }
-
-    @RequestMapping("/axqRegister")
-    public ResponseDTO<?> axqRegister(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String idCard = jsonObj.getString("idCard");
-        String phone = jsonObj.getString("phone");
-        String name = jsonObj.getString("name");
-        if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(phone) || StringUtils.isEmpty(name)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        return userAXQInfoService.registAXQUser(idCard, phone, name);
-    }
-
-    // 人脸核身
-    @RequestMapping("/order/getFaceId")
-    public ResponseDTO<?> getFaceId(@RequestBody String json) throws Exception {
-
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String userName = jsonObj.getString("userName");
-        String idCard = jsonObj.getString("idCard");
-        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        JSONObject str = SdkTest.getFaceId(faceVerify.getBankWebankAppId(), faceVerify.getBankSecret(),
-                faceVerify.getBankKeyLicence(), userName, idCard, idCard);
-        return ResponseDTO.success(str);
-    }
-
-    @AnonymousPostMapping("/video/call")
-    public ResponseDTO<?> videoCall(@RequestBody String json) {
-        return bankNotarizeService.videoCall(json);
-    }
-
-    @RequestMapping("/order/pdf")
-    public ResponseDTO<?> getOrderPDF(@RequestBody String json) {
-
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String businessNo = jsonObj.getString("businessNo");
-        if (StringUtils.isEmpty(businessNo)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        ResponseDTO<?> order = bankNotarizeService.getOrderPDF(businessNo);
-
-        return order;
-    }
-
-    @AnonymousPostMapping("/order/note")
-    public ResponseDTO<?> note(@RequestBody String json) {
-
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String businessNo = jsonObj.getString("businessNo");
-        if (StringUtils.isEmpty(businessNo)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        //
-        OrderFileEntity orderFile = orderFileRepository.getOrderNote(businessNo);
-        // pdf的地址预览
-        String noteUrl = FileUploadUtil.getPreviewUrl(orderFile.getHtmlUrl());
-
-        return ResponseDTO.success(noteUrl);
-    }
-
-    @RequestMapping("/sendAuthMessage")
-    public ResponseDTO<?> sendAuthMessage(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String idCard = jsonObj.getString("idCard");
-        if (StringUtils.isEmpty(idCard)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        return userAXQInfoService.sendAuthMessage(idCard);
-    }
-
-    @RequestMapping("/verifyAuthMessage")
-    public ResponseDTO<?> verifyAuthMessage(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String idCard = jsonObj.getString("idCard");
-        String checkCode = jsonObj.getString("checkCode");
-        if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(checkCode)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        return userAXQInfoService.verifyAuthMessage(idCard, checkCode);
-    }
-
-    @RequestMapping("/getAuthStatus")
-    public ResponseDTO<?> getAuthStatus(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String idCard = jsonObj.getString("idCard");
-        if (StringUtils.isEmpty(idCard)) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        return userAXQInfoService.getAuthStatus(idCard);
-    }
-
-    @AnonymousPostMapping("/uploadSeal")
-    public ResponseDTO<?> uploadSeal(@RequestBody String json) {
-        JSONObject jsonObj = JSONObject.parseObject(json);
-        String businessNo = jsonObj.getString("businessNo");
-        JSONArray jsonArray = jsonObj.getJSONArray("signInfo");
-        if (StringUtils.isEmpty(businessNo) || jsonArray == null) {
-            return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
-        }
-        return userAXQInfoService.uploadSeal(businessNo, jsonArray);
-    }
+	private final OrderFileRepository orderFileRepository;
+	private final UserAXQInfoService userAXQInfoService;
+	private final BankNotarizeService bankNotarizeService;
+	private final TencentHumanFaceVerify faceVerify;
+
+	/**
+	 * 获取签名公证书URL
+	 *
+	 * @param json
+	 * @return
+	 * @throws Exception 
+	 */
+	@RequestMapping("/getNotarization")
+	public ResponseDTO<?> getNotarization(@RequestBody String json) throws Exception {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String businessNo = jsonObj.getString("businessNo");
+		if (StringUtils.isEmpty(businessNo)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		OrderFileEntity orderFile = orderFileRepository.getOrderNotarization(businessNo);
+		// 下载到指定的目录
+		String filePath = "tmp/" + UUIDGenerator.uuid() + ".pdf";
+		
+		return ResponseDTO.success(FileUploadUtil.getCustomUrl(orderFile.getSignedPdfUrl(),filePath));
+	}
+
+	@RequestMapping("/axqRegister")
+	public ResponseDTO<?> axqRegister(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String idCard = jsonObj.getString("idCard");
+		String phone = jsonObj.getString("phone");
+		String name = jsonObj.getString("name");
+		if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(phone) || StringUtils.isEmpty(name)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		return userAXQInfoService.registAXQUser(idCard, phone, name);
+	}
+
+	// 人脸核身
+	@RequestMapping("/order/getFaceId")
+	public ResponseDTO<?> getFaceId(@RequestBody String json) throws Exception {
+
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String userName = jsonObj.getString("userName");
+		String idCard = jsonObj.getString("idCard");
+		if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		JSONObject str = SdkTest.getFaceId(faceVerify.getBankWebankAppId(), faceVerify.getBankSecret(),
+				faceVerify.getBankKeyLicence(), userName, idCard, idCard);
+		return ResponseDTO.success(str);
+	}
+
+	@AnonymousPostMapping("/video/call")
+	public ResponseDTO<?> videoCall(@RequestBody String json) {
+		return bankNotarizeService.videoCall(json);
+	}
+
+	@RequestMapping("/order/pdf")
+	public ResponseDTO<?> getOrderPDF(@RequestBody String json) {
+
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String businessNo = jsonObj.getString("businessNo");
+		if (StringUtils.isEmpty(businessNo)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		ResponseDTO<?> order = bankNotarizeService.getOrderPDF(businessNo);
+
+		return order;
+	}
+
+	@AnonymousPostMapping("/order/note")
+	public ResponseDTO<?> note(@RequestBody String json) {
+
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String businessNo = jsonObj.getString("businessNo");
+		if (StringUtils.isEmpty(businessNo)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		//
+		OrderFileEntity orderFile = orderFileRepository.getOrderNote(businessNo);
+		// pdf的地址预览
+		String noteUrl = FileUploadUtil.getPreviewUrl(orderFile.getHtmlUrl());
+
+		return ResponseDTO.success(noteUrl);
+	}
+
+	@RequestMapping("/sendAuthMessage")
+	public ResponseDTO<?> sendAuthMessage(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String idCard = jsonObj.getString("idCard");
+		if (StringUtils.isEmpty(idCard)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		return userAXQInfoService.sendAuthMessage(idCard);
+	}
+
+	@RequestMapping("/verifyAuthMessage")
+	public ResponseDTO<?> verifyAuthMessage(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String idCard = jsonObj.getString("idCard");
+		String checkCode = jsonObj.getString("checkCode");
+		if (StringUtils.isEmpty(idCard) || StringUtils.isEmpty(checkCode)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		return userAXQInfoService.verifyAuthMessage(idCard, checkCode);
+	}
+
+	@RequestMapping("/getAuthStatus")
+	public ResponseDTO<?> getAuthStatus(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String idCard = jsonObj.getString("idCard");
+		if (StringUtils.isEmpty(idCard)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		return userAXQInfoService.getAuthStatus(idCard);
+	}
+
+	@AnonymousPostMapping("/uploadSeal")
+	public ResponseDTO<?> uploadSeal(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String businessNo = jsonObj.getString("businessNo");
+		JSONArray jsonArray = jsonObj.getJSONArray("signInfo");
+		if (StringUtils.isEmpty(businessNo) || jsonArray == null) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		return userAXQInfoService.uploadSeal(businessNo, jsonArray);
+	}
 }

+ 14 - 7
eladmin-system/src/main/java/me/zhengjie/application/user/app/controller/AppUserController.java

@@ -44,9 +44,9 @@ public class AppUserController {
 	@Autowired
 	BankOrderService bankOrderService;
 	@Autowired
-    UserOrderService userOrderService;
+	UserOrderService userOrderService;
 	@Autowired
-    UserAXQInfoService userAXQInfoService;
+	UserAXQInfoService userAXQInfoService;
 	@Autowired
 	private RedisTemplate<String, String> redisTemplate;
 
@@ -89,7 +89,7 @@ public class AppUserController {
 		JSONObject jsonObj = JSONObject.parseObject(json);
 		String businessNo = jsonObj.getString("businessNo");
 		String contractNo = jsonObj.getString("contractNo");
-		if (StringUtils.isEmpty(businessNo)||StringUtils.isEmpty(contractNo)) {
+		if (StringUtils.isEmpty(businessNo) || StringUtils.isEmpty(contractNo)) {
 			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
 		}
 		BankOrderVO order = bankOrderService.getContractOrderWithBizNo(businessNo);
@@ -128,16 +128,18 @@ public class AppUserController {
 
 		return order;
 	}
+
 	@RequestMapping("/order/search")
-	public ResponseDTO<?> orderSearch( @RequestBody BankOrderVO order ) {
-		 
+	public ResponseDTO<?> orderSearch(@RequestBody BankOrderVO order) {
+
 		if (order == null) {
 			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
 		}
-		 List<BankOrderVO> orders = this.apiService.getOrderByContion(order);
-		
+		List<BankOrderVO> orders = this.apiService.getOrderByContion(order);
+
 		return ResponseDTO.success(orders);
 	}
+
 	@AnonymousPostMapping("/order/note")
 	public ResponseDTO<?> note(@RequestBody String json) {
 
@@ -252,6 +254,11 @@ public class AppUserController {
 			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
 		}
 		OrderFileEntity orderFile = orderFileRepository.getOrderNotarization(businessNo);
+		// 下载pdf
+		String pdf = orderFile.getSignedPdfUrl();
+		//APP_UPLOAD_PATH
+		//pdf
+		// FileUploadUtil.getInputStream(objectName)
 		return ResponseDTO.success(FileUploadUtil.getPreviewUrl(orderFile.getSignedPdfUrl()));
 	}
 }

+ 8 - 3
eladmin-system/src/main/java/me/zhengjie/base/file/FileHandle.java

@@ -2,7 +2,6 @@ package me.zhengjie.base.file;
 
 import java.io.InputStream;
 
-
 public interface FileHandle {
 
 	/**
@@ -42,19 +41,25 @@ public interface FileHandle {
 	 * @Description: (获取 ⽂ 件外链) [bucketName 桶名, objectName 文件名, expires 时间<=1小时]
 	 */
 
-	public String getPreviewUrl(String fileKey) throws Exception ;
+	public String getPreviewUrl(String fileKey) throws Exception;
+
 	/**
 	 * 通过文件id得到文件流
+	 * 
 	 * @param fileId
 	 * @return
 	 * @throws Exception
 	 */
 	public byte[] getByte(String fileId) throws Exception;
+
 	/**
 	 * 得到文件的大小
+	 * 
 	 * @param keyName
 	 * @return
 	 * @throws Exception
 	 */
-	public long getSize(String keyName)throws Exception ;
+	public long getSize(String keyName) throws Exception;
+
+	public String getCustomUrl(String fileKey, String filePath) throws Exception;
 }

+ 6 - 0
eladmin-system/src/main/java/me/zhengjie/base/file/LocalFileHandle.java

@@ -48,4 +48,10 @@ public class LocalFileHandle extends AbstractFileHandle {
 		return 0;
 	}
 
+	@Override
+	public String getCustomUrl(String fileKey, String filePath) throws Exception {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }

+ 39 - 10
eladmin-system/src/main/java/me/zhengjie/base/file/MinioFileHandle.java

@@ -1,11 +1,14 @@
 package me.zhengjie.base.file;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 
 import javax.annotation.PostConstruct;
 
 import me.zhengjie.dao.mybatis.mapper.FileInfoMapper;
+
+import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
@@ -18,6 +21,7 @@ import io.minio.PutObjectOptions;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.dao.mybatis.entity.FileInfoEntity;
 import me.zhengjie.application.bank.service.FileInfoService;
+import me.zhengjie.base.config.AppConfigInfo;
 
 @Slf4j
 @Primary
@@ -35,10 +39,10 @@ public class MinioFileHandle extends AbstractFileHandle {
 	// minio的连接secretkey
 	@Value("${app.minio.secretkey:minioadmin}")
 	public String appMinioSecretkey;
-	
+
 	@Autowired
 	public FileInfoMapper fileInfoMapper;
-	
+
 	private MinioClient minioClient;
 
 	@PostConstruct
@@ -114,17 +118,42 @@ public class MinioFileHandle extends AbstractFileHandle {
 	public String getObjectUrl(String keyName) throws Exception {
 		return minioClient.presignedGetObject(bucketName, keyName, 3600);
 	}
-	 
+
+	/**
+	 * 自定义url
+	 * 
+	 * @param fileKey 文件的
+	 * @return
+	 */
+	public String getCustomUrl(String fileKey, String filePath) {
+		try {
+			// return fileHandle.getPreviewUrl(fileKey);
+			InputStream input = minioClient.getObject(bucketName, fileKey);
+			byte[] b = IoUtil.readBytes(input);
+			String uploadPath = AppConfigInfo.APP_UPLOAD_PATH;
+			if (!uploadPath.endsWith("/")) {
+				uploadPath = uploadPath + "/";
+			}
+			filePath = uploadPath + filePath;
+			FileUtils.writeByteArrayToFile(new File(filePath), b);
+			return appMinioPreview + filePath;
+		} catch (Exception e) {
+			log.error("图片预览失败:" + e.getLocalizedMessage());
+			return null;
+		}
+	}
+
 	public byte[] getByte(String fileId) throws Exception {
 		FileInfoEntity fileInfo = fileInfoMapper.selectById(fileId);
-		String path=fileInfo.getPath();
-		InputStream inputStream=this.getObject(path);
-		//这里已经关闭流,不需要手动关闭
+		String path = fileInfo.getPath();
+		InputStream inputStream = this.getObject(path);
+		// 这里已经关闭流,不需要手动关闭
 		return IoUtil.readBytes(inputStream);
 	}
-	public long getSize(String keyName)throws Exception {
-		  ObjectStat stat = minioClient.statObject(bucketName, keyName);
-		  long length =  stat.length();
-		  return length;
+
+	public long getSize(String keyName) throws Exception {
+		ObjectStat stat = minioClient.statObject(bucketName, keyName);
+		long length = stat.length();
+		return length;
 	}
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 13 - 10
eladmin-system/src/main/java/me/zhengjie/base/util/FileUploadUtil.java