diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 14a675f..418209b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,43 +5,17 @@ - - - - - - - - - - - - - - + + + - - - - - - - - - - + - - - - - - - + + - - + - { - "keyToString": { - "Maven.HnRealNameBmw [clean].executor": "Run", - "Maven.HnRealNameBmw [install].executor": "Run", - "Maven.HnRealNameMmw [clean].executor": "Run", - "Maven.HnRealNameMmw [install].executor": "Run", - "Maven.hn-czl-service [clean].executor": "Run", - "Maven.hn-czl-service [install].executor": "Run", - "Maven.hn-gateway [clean].executor": "Run", - "Maven.hn-gateway [install].executor": "Run", - "Maven.hn_czl_screen [clean].executor": "Run", - "Maven.hn_czl_screen [install].executor": "Run", - "Maven.ldlz [clean].executor": "Run", - "Maven.ldlz [install].executor": "Run", - "Maven.real-name [clean].executor": "Run", - "Maven.real-name [install].executor": "Run", - "Maven.real-name-screen [clean].executor": "Run", - "Maven.real-name-screen [install].executor": "Run", - "Maven.realname-app [clean].executor": "Run", - "Maven.realname-app [install].executor": "Run", - "RequestMappingsPanelOrder0": "0", - "RequestMappingsPanelOrder1": "1", - "RequestMappingsPanelWidth0": "75", - "RequestMappingsPanelWidth1": "75", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.git.unshallow": "true", - "SONARLINT_PRECOMMIT_ANALYSIS": "true", - "Spring Boot.BonusGatewayApplication.executor": "Debug", - "Spring Boot.CzlScreenApplication.executor": "Run", - "Spring Boot.CzlServiceApplication.executor": "Debug", - "Spring Boot.HnRealNameBmwApplication.executor": "Debug", - "Spring Boot.LdlzApplication.executor": "Debug", - "Spring Boot.RealNameAppApplication.executor": "Debug", - "Spring Boot.RnamaApplication.executor": "Run", - "Spring Boot.RnmwApplication.executor": "Run", - "git-widget-placeholder": "main", - "kotlin-language-version-configured": "true", - "last_opened_file_path": "F:/workspace/idea/hn_cloud_service/realname-app/src/main/java/com/bonus/hnrn/rnama/core", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "project.structure.last.edited": "Project", - "project.structure.proportion": "0.15", - "project.structure.side.proportion": "0.43843496", - "run.configurations.included.in.services": "true", - "settings.editor.selected.configurable": "reference.settings.project.maven.importing", - "vue.rearranger.settings.migration": "true" + +}]]> + - @@ -290,7 +264,7 @@ - + - diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/BnsSecurityConfig.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/BnsSecurityConfig.java index 4a3dc4d..353159d 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/BnsSecurityConfig.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/BnsSecurityConfig.java @@ -53,7 +53,7 @@ public class BnsSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests()//开启登录配置 - .antMatchers("/gzRealName/**","/user/**","/offLine/**","/login").permitAll() + .antMatchers("/gzRealName/**","/user/**","/offLine/**","/login","/api/resource/getResourceFile").permitAll() .anyRequest().authenticated();//表示剩余的其他接口,登录之后就能访问 http.formLogin().loginProcessingUrl("/login") //登录成功的处理器 diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/TokenFilter.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/TokenFilter.java index 1ff3c0e..d71f01e 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/TokenFilter.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/config/TokenFilter.java @@ -40,7 +40,7 @@ public class TokenFilter extends OncePerRequestFilter { throws ServletException, IOException { String token = getToken(request); String requestURI = request.getRequestURI(); - if ("/login".equals(requestURI)) { + if ("/login".equals(requestURI) || "/api/resource/getResourceFile".equals(requestURI)) { filterChain.doFilter(request, response); return; }else{ diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/core/controller/ResourceFileController.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/controller/ResourceFileController.java new file mode 100644 index 0000000..2a38f19 --- /dev/null +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/core/controller/ResourceFileController.java @@ -0,0 +1,117 @@ +package com.bonus.hnrn.rnama.core.controller; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + +import org.springframework.web.bind.annotation.RequestParam; + + + +@RestController +@RequestMapping("/api/resource") +public class ResourceFileController { + + // 固定文件根目录(resources/files/) + private static final String RESOURCE_ROOT = "file/"; + + @GetMapping("getResourceFile") + public ResponseEntity getResourceFile(@RequestParam String filePath) { // 显式声明@RequestParam,避免参数绑定失败 + try { + // 1. 入参校验(避免空指针) + if (filePath == null || filePath.trim().isEmpty()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + String fullPath = RESOURCE_ROOT + filePath.trim(); + Resource resource = new ClassPathResource(fullPath); + long originalFileSize = 0; + if (resource.exists()) { + originalFileSize = resource.contentLength(); + } + + // 2. 校验文件存在性 + if (!resource.exists() || !resource.isReadable()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); + } + // 3. 读取文件字节流(核心:确保完整读取,兼容JAR包) + byte[] fileBytes; + try (InputStream inputStream = resource.getInputStream()) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + bos.write(buffer, 0, bytesRead); + } + fileBytes = bos.toByteArray(); + // 校验读取完整性 + if (fileBytes.length != originalFileSize) { + System.err.println("警告:读取的字节数与原文件大小不一致!"); + } + } catch (IOException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); + } + + // 4. 确定媒体类型(优先PDF,兜底自动识别) + MediaType mediaType = MediaType.APPLICATION_PDF; + if (!filePath.endsWith(".pdf")) { + mediaType = getMediaTypeByFileName(filePath); + } + + // 5. 构建响应头(解决乱码/空白核心) + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(mediaType); // 强制媒体类型 + headers.setContentLength(fileBytes.length); // 明确文件大小 + // 禁用缓存,避免浏览器加载旧文件 + headers.setCacheControl(CacheControl.noCache().noStore().getHeaderValue()); + // 跨域配置(完整且正确) + // headers.setAccessControlAllowOrigin("*"); +// List allowedMethods = Arrays.asList(HttpMethod.GET, HttpMethod.OPTIONS); +// headers.setAccessControlAllowMethods(allowedMethods); + // 关键:预览模式(inline),避免触发下载 + // 设置Content-Disposition + headers.setContentDisposition(ContentDisposition.builder("inline") + .filename(filePath, java.nio.charset.StandardCharsets.UTF_8) + .build()); + + // 6. 返回字节数组(核心修正:不再返回Resource) + return ResponseEntity.ok() + .headers(headers) + .body(fileBytes); + + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); + } + } + + /** + * 兜底的媒体类型识别 + */ + private MediaType getMediaTypeByFileName(String fileName) { + if (fileName == null) { + return MediaType.APPLICATION_OCTET_STREAM; + } + String lowerName = fileName.toLowerCase(); + if (lowerName.endsWith(".jpg") || lowerName.endsWith(".jpeg")) { + return MediaType.IMAGE_JPEG; + } else if (lowerName.endsWith(".png")) { + return MediaType.IMAGE_PNG; + } else if (lowerName.endsWith(".gif")) { + return MediaType.IMAGE_GIF; + } else if (lowerName.endsWith(".json")) { + return MediaType.APPLICATION_JSON; + } else { + return MediaType.APPLICATION_OCTET_STREAM; + } +} +} \ No newline at end of file diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/ContractBean.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/ContractBean.java index ac648df..57a5402 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/ContractBean.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/ContractBean.java @@ -19,6 +19,8 @@ public class ContractBean { * 视频录制 */ private String videoUrl; + + private String videoUrlPath; /** * 甲方身份证 */ @@ -181,6 +183,8 @@ public class ContractBean { private String messageTime; private String shortMessage; private String personPdfUrl; + + private String personPdfUrlPath; private String subPdfUrl; private String proId; private String subId; @@ -211,7 +215,10 @@ public class ContractBean { /** * 安全协议书路径 */ + private String aqxysPath; + + private String aqxysPathUrl; /** * 安全协议书签署路径 */ diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/WorkerPhotoBean.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/WorkerPhotoBean.java index 8c7aef3..ff2938e 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/WorkerPhotoBean.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/entity/WorkerPhotoBean.java @@ -22,20 +22,31 @@ public class WorkerPhotoBean implements Serializable { * 身份证正面照片 */ private String frontPhoto; + + private String frontPhotoUrl; /** * 身份证反面照片 */ private String backPhoto; + + private String backPhotoUrl; /** * 人脸 */ private String facePhoto; + + private String facePhotoUrl; /** * 银行卡 */ private String bankPhoto; + + private String bankPhotoUrl; + /** * 签名 */ private String signaturePhoto; + + private String signaturePhotoUrl; } diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/PersonIdentifyServiceImpl.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/PersonIdentifyServiceImpl.java index 68a0bac..0035d5c 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/PersonIdentifyServiceImpl.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/PersonIdentifyServiceImpl.java @@ -38,11 +38,11 @@ public class PersonIdentifyServiceImpl implements PersonIdentifyService { public WorkerPhotoBean selectWorkerPhotoByIdNumber(WorkerPhotoBean bean) { WorkerPhotoBean ben= dao.selectWorkerPhotoByIdNumber(bean); if(ben!=null){ - ben.setBankPhoto(uploadService.getPresignedUrl(ben.getBankPhoto())); - ben.setSignaturePhoto(uploadService.getPresignedUrl(ben.getSignaturePhoto())); - ben.setBackPhoto(uploadService.getPresignedUrl(ben.getBackPhoto())); - ben.setFacePhoto(uploadService.getPresignedUrl(ben.getFacePhoto())); - ben.setFrontPhoto(uploadService.getPresignedUrl(ben.getFrontPhoto())); + ben.setBankPhotoUrl(uploadService.getPresignedUrl(ben.getBankPhoto())); + ben.setSignaturePhotoUrl(uploadService.getPresignedUrl(ben.getSignaturePhoto())); + ben.setBackPhotoUrl(uploadService.getPresignedUrl(ben.getBackPhoto())); + ben.setFacePhotoUrl(uploadService.getPresignedUrl(ben.getFacePhoto())); + ben.setFrontPhotoUrl(uploadService.getPresignedUrl(ben.getFrontPhoto())); } return ben; } diff --git a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/WorkPersonServiceImpl.java b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/WorkPersonServiceImpl.java index 9e8573a..5644d0f 100644 --- a/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/WorkPersonServiceImpl.java +++ b/realname-app/src/main/java/com/bonus/hnrn/rnama/person/service/WorkPersonServiceImpl.java @@ -278,15 +278,23 @@ public class WorkPersonServiceImpl implements WorkPersonService { public List queryList(ContractBean bean) { List list= workPersonDao.queryList(bean); for (ContractBean bean2 : list) { - bean2.setVideoUrl(uploadService.getPresignedUrl(bean2.getVideoUrl())); - bean2.setPersonPdfUrl(uploadService.getPresignedUrl(bean2.getPersonPdfUrl())); + bean2.setVideoUrlPath(uploadService.getPresignedUrl(bean2.getVideoUrl())); + bean2.setPersonPdfUrlPath(uploadService.getPresignedUrl(bean2.getPersonPdfUrl())); + bean2.setAqxysPathUrl(uploadService.getPresignedUrl(bean2.getAqcnsPath())); } return list; } @Override public List queryIsSignList(ContractBean bean) { - return workPersonDao.queryIsSignList(bean); + List list= workPersonDao.queryIsSignList(bean); + for (ContractBean bean2 : list) { + bean2.setPersonPdfUrlPath(uploadService.getPresignedUrl(bean2.getPersonPdfUrl())); + bean2.setVideoUrlPath(uploadService.getPresignedUrl(bean2.getVideoUrl())); + bean2.setAqxysPathUrl(uploadService.getPresignedUrl(bean2.getAqcnsPath())); + + } + return list; } @Override @@ -382,7 +390,7 @@ public class WorkPersonServiceImpl implements WorkPersonService { Map map=uploadService.uploadLocalFile(lastFile,"app/contract/pdf"); String url=uploadService.getPresignedUrl(map.get("url")); boolean isDel=lastFile.delete(); - return Ajax.ok(url,path); + return Ajax.ok(url,map.get("url")); } return !tf ? Ajax.ok(path) : Ajax.error(bean.getPartB() + "已存在电子合同或电子合同未签署完,请勿重复提交"); } diff --git a/realname-app/src/main/resources/file/aqgzs.pdf b/realname-app/src/main/resources/file/aqgzs.pdf new file mode 100644 index 0000000..eb6f592 Binary files /dev/null and b/realname-app/src/main/resources/file/aqgzs.pdf differ diff --git a/realname-app/src/main/resources/file/ygxy.pdf b/realname-app/src/main/resources/file/ygxy.pdf new file mode 100644 index 0000000..cf4354f Binary files /dev/null and b/realname-app/src/main/resources/file/ygxy.pdf differ diff --git a/realname-app/src/main/resources/mappers/person/WorkPersonMapper.xml b/realname-app/src/main/resources/mappers/person/WorkPersonMapper.xml index dd42492..d75829d 100644 --- a/realname-app/src/main/resources/mappers/person/WorkPersonMapper.xml +++ b/realname-app/src/main/resources/mappers/person/WorkPersonMapper.xml @@ -969,7 +969,7 @@ ,#{isXbg} - ,,#{xbgContractId} + ,#{xbgContractId} )