From 31fa480c07623ff4a87723b71dbe418f57a4e00c Mon Sep 17 00:00:00 2001
From: du <1725534722@qq.com>
Date: Mon, 26 May 2025 16:03:11 +0800
Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/pom.xml | 2 +-
.../BasicInformationController.java | 197 ++++++++++++++++--
.../gysl/entity/GyslProjectHandbook.java | 29 +--
.../gysl/entity/response/JgysbabResponse.java | 52 +++++
.../controller/SingleLoginController.java | 84 ++++----
.../com/ruoyi/gysl/login/util/StringUtil.java | 163 +++++++++++++++
.../impl/GyslProjectHandbookServiceImpl.java | 52 +++--
.../src/main/resources/application-druid.yml | 12 +-
.../main/resources/application-internet.yml | 7 +
.../src/main/resources/application.yml | 17 +-
.../mapper/BasicInformationMapper.xml | 2 +
.../framework/config/SecurityConfig.java | 4 +-
.../web/service/SysLoginService.java | 2 +-
13 files changed, 523 insertions(+), 100 deletions(-)
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/JgysbabResponse.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/gysl/login/util/StringUtil.java
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 4a0f2a8..cb10915 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -46,7 +46,7 @@
cn.hutool
hutool-all
- 5.8.37
+ 5.8.23
org.jsoup
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java
index f8cafe4..9615071 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java
@@ -3,6 +3,8 @@ package com.ruoyi.gysl.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
+import cn.hutool.crypto.SmUtil;
+import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -17,6 +19,9 @@ import com.ruoyi.gysl.entity.request.AuditRequest;
import com.ruoyi.gysl.entity.request.BasicInformationPageReq;
import com.ruoyi.gysl.entity.response.BasicInformationResponse;
import com.ruoyi.gysl.entity.response.ProjectExcelInfo;
+import com.ruoyi.gysl.login.util.SM2Demo;
+import com.ruoyi.gysl.login.util.SM4Demo;
+import com.ruoyi.gysl.login.util.StringUtil;
import com.ruoyi.gysl.service.*;
import com.ruoyi.system.mapper.SysDictDataMapper;
import io.swagger.annotations.Api;
@@ -29,16 +34,15 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.OutputStream;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
import java.util.*;
/**
@@ -99,6 +103,176 @@ public class BasicInformationController extends BaseController {
@Resource
private ProjectOtherInfoService projectOtherInfoService;
+
+ @Value("${isZs}")
+ private Boolean isZs;
+ private static final String BOUNDARY = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; // 边界字符串(需唯一)
+
+ @Value("${sm2}")
+ private String sm2;
+
+ @Value("${sm4}")
+ private String sm4;
+
+ @Value("${accessId}")
+ private String accessId;
+
+ @Value("${sceneId}")
+ private String sceneId;
+
+ /**
+ * 建筑工程施工许可
+ */
+ @ApiOperation("建筑工程施工许可")
+ @GetMapping("/getJzgcsgxk")
+ public AjaxResult getJzgcsgxk() throws Exception {
+ if (isZs) {
+ String czztdm = "91320594608197761G";
+ String contacts = "http://172.21.10.46/api/invoke/323018/jzgcsgxk";
+ String a1 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(accessId.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ String a2 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(czztdm.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ String a4 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(sceneId.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ //生成sm3签名
+ String input = "accessId=" + accessId + "&czztdm=" + czztdm + "&sceneId=" + sceneId;
+ try {
+ // 1. 构建 URL(含签名参数,处理特殊符号)
+ String encodedSignature = URLEncoder.encode(SmUtil.sm3(input), "UTF-8")
+ .replace("+", "%20"); // 确保 + 不被编码为空格
+ String fullUrl = contacts + "?signature=" + encodedSignature;
+ // 2. 创建连接
+ URL url = new URL(fullUrl);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod("POST");
+ conn.setDoOutput(true);
+ conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
+
+ // 3. 构建请求体(严格对齐 curl -F 格式)
+ try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) {
+ writeFormField(out, "accessId", a1);
+ writeFormField(out, "czztdm", a2);
+ writeFormField(out, "sceneId", a4);
+ // 结束标记
+ out.writeBytes("--" + BOUNDARY + "--\r\n");
+ }
+ // 4. 处理响应
+ int statusCode = conn.getResponseCode();
+ StringBuilder response = getResponse(statusCode, conn);
+ if (statusCode == 200) {
+ JSONObject jsonObj = JSONObject.parseObject(String.valueOf(response));
+// if ("200".equals(jsonObj.getString("code"))) { // 使用 getString 避免类型问题
+ // 直接获取 data 字段为 JSONObject(无需转换 String)
+ JSONObject reqData = jsonObj.getJSONObject("data");
+ String responseParams = reqData.getString("responseParams");
+ String s = new String((byte[]) SM2Demo.dexec(
+ Base64.getDecoder().decode(responseParams), "C1C2C3",
+ Base64.getDecoder().decode(sm2)),
+ StandardCharsets.UTF_8);
+ return AjaxResult.success(StringUtil.getFinalData(s));
+ }
+// }
+ } catch (Exception y) {
+ y.printStackTrace();
+ }
+ }
+ return success();
+ }
+
+ /**
+ * 建筑工程竣工验收备案表
+ */
+ @ApiOperation("建筑工程竣工验收备案表")
+ @GetMapping("/getJgysbab")
+ public AjaxResult getJgysbab() throws Exception {
+ if (isZs) {
+ String czztdm = "9132059456176406XP";
+ String czztmc = "苏州纳米科技发展有限公司";
+ System.out.println(czztdm);
+ System.out.println(czztmc);
+ String contacts = "http://172.21.10.46/api/invoke/323018/jzgcjgysbab";
+ String a1 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(accessId.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ String a2 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(czztdm.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ String a3 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(czztmc.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ String a4 = Base64.getEncoder().encodeToString((byte[])
+ SM4Demo.exec(sceneId.getBytes(),
+ "ECB", "PKCS5Padding", "random", sm4.getBytes(), null));
+ //生成sm3签名
+ String input = "accessId=" + accessId + "&czztdm=" + czztdm + "&czztmc=" + czztmc + "&sceneId=" + sceneId;
+ try {
+ // 1. 构建 URL(含签名参数,处理特殊符号)
+ String encodedSignature = URLEncoder.encode(SmUtil.sm3(input), "UTF-8")
+ .replace("+", "%20"); // 确保 + 不被编码为空格
+ String fullUrl = contacts + "?signature=" + encodedSignature;
+ // 2. 创建连接
+ URL url = new URL(fullUrl);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod("POST");
+ conn.setDoOutput(true);
+ conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
+
+ // 3. 构建请求体(严格对齐 curl -F 格式)
+ try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) {
+ writeFormField(out, "accessId", a1);
+ writeFormField(out, "czztdm", a2);
+ writeFormField(out, "czztmc", a3);
+ writeFormField(out, "sceneId", a4);
+ // 结束标记
+ out.writeBytes("--" + BOUNDARY + "--\r\n");
+ }
+ // 4. 处理响应
+ int statusCode = conn.getResponseCode();
+ StringBuilder response = getResponse(statusCode, conn);
+ if (statusCode == 200) {
+ JSONObject jsonObj = JSONObject.parseObject(String.valueOf(response));
+// if ("200".equals(jsonObj.getString("code"))) { // 使用 getString 避免类型问题
+ // 直接获取 data 字段为 JSONObject(无需转换 String)
+ JSONObject reqData = jsonObj.getJSONObject("data");
+ String responseParams = reqData.getString("responseParams");
+ String s = new String((byte[]) SM2Demo.dexec(
+ Base64.getDecoder().decode(responseParams), "C1C2C3",
+ Base64.getDecoder().decode(sm2)),
+ StandardCharsets.UTF_8);
+ System.out.println(s);
+ return AjaxResult.success(StringUtil.getFinalData(s));
+ }
+ } catch (Exception y) {
+ y.printStackTrace();
+ }
+ }
+ return success();
+ }
+
+ private static StringBuilder getResponse(int statusCode, HttpURLConnection conn) throws IOException {
+ StringBuilder response = new StringBuilder();
+ try (BufferedReader in = new BufferedReader(new InputStreamReader(
+ (statusCode >= 200 && statusCode < 300) ? conn.getInputStream() : conn.getErrorStream(),
+ StandardCharsets.UTF_8))) {
+ String line;
+ while ((line = in.readLine()) != null) {
+ response.append(line);
+ }
+ }
+ return response;
+ }
+
+ private static void writeFormField(DataOutputStream out, String name, String value) throws Exception {
+ out.writeBytes("--" + BOUNDARY + "\r\n");
+ out.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n");
+ out.writeBytes("Content-Type: text/plain; charset=UTF-8\r\n\r\n");
+ out.writeBytes(value + "\r\n");
+ }
+
/**
* 分页查询所有数据
*
@@ -272,7 +446,6 @@ public class BasicInformationController extends BaseController {
}
-
/**
* 模板信息
*/
@@ -373,12 +546,12 @@ public class BasicInformationController extends BaseController {
map.put("issuingTime", a1.getBasicInformation().getIssuingTime() != null ? a1.getBasicInformation().getIssuingTime() : "/");
map.put("jsjd", a1.getBasicInformation().getJsjd() != null ? a1.getBasicInformation().getJsjd() : "/");
map.put("xzfl", a1.getBasicInformation().getXzfl() != null ?
- basicInformationService.getDictLabel("xzfl", String.valueOf(a1.getBasicInformation().getXzfl()),sysDictData) : "/");
+ basicInformationService.getDictLabel("xzfl", String.valueOf(a1.getBasicInformation().getXzfl()), sysDictData) : "/");
map.put("nature", a1.getBasicInformation().getNature() != null ?
- basicInformationService.getDictLabel("xmfrdwxz", String.valueOf(a1.getBasicInformation().getNature()),sysDictData) : "/");
+ basicInformationService.getDictLabel("xmfrdwxz", String.valueOf(a1.getBasicInformation().getNature()), sysDictData) : "/");
map.put("name", a1.getBasicInformation().getName() != null ? a1.getBasicInformation().getName() : "/");
map.put("ssgnq", a1.getBasicInformation().getSsgnq() != null ?
- basicInformationService.getDictLabel("ssgnq", String.valueOf(a1.getBasicInformation().getSsgnq()),sysDictData) : "/");
+ basicInformationService.getDictLabel("ssgnq", String.valueOf(a1.getBasicInformation().getSsgnq()), sysDictData) : "/");
map.put("jsdd", a1.getBasicInformation().getJsdd() != null ? a1.getBasicInformation().getJsdd() : "/");
map.put("xmfrdwxz", a1.getBasicInformation().getXmfrdwxz() != null ? a1.getBasicInformation().getXmfrdwxz() : "/");
map.put("tyshxydm", a1.getBasicInformation().getTyshxydm() != null ? a1.getBasicInformation().getTyshxydm() : "/");
@@ -412,7 +585,7 @@ public class BasicInformationController extends BaseController {
map.put("kzczmj", a1.getQyrzInformation().getKzczmj() != null ? a1.getQyrzInformation().getKzczmj() : "/");
map.put("gycfpjzj", a1.getQyrzInformation().getGycfpjzj() != null ? a1.getQyrzInformation().getGycfpjzj() : "/");
try {
- String itemsFileName = fatherFile + "/" + a1.getBasicInformation().getName()+".docx";
+ String itemsFileName = fatherFile + "/" + a1.getBasicInformation().getName() + ".docx";
Path targetPath = Paths.get(itemsFileName);
Files.createDirectories(targetPath.getParent());
// 2. 打开输出流(自动覆盖已有文件)
@@ -420,7 +593,7 @@ public class BasicInformationController extends BaseController {
Files.newOutputStream(targetPath,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING))) {
- basicInformationService.generateDocument(map,"xmdtcl.docx",out);
+ basicInformationService.generateDocument(map, "xmdtcl.docx", out);
}
} catch (Exception e) {
throw new RuntimeException("文件下载失败");
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslProjectHandbook.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslProjectHandbook.java
index 8ce27a1..24b1835 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslProjectHandbook.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslProjectHandbook.java
@@ -33,27 +33,30 @@ public class GyslProjectHandbook extends BaseModel {
@NotBlank(message = "手册名称不能为空!")
private String name;
- @ApiModelProperty(value ="副标题" )
- private String subtitle;
-
+ @ApiModelProperty(value ="副标题1" )
+ private String subtitle1;
- @ApiModelProperty(value ="封面图片" )
- @NotBlank(message = "封面图片不能为空!")
- private String coverImg;
-
+ @ApiModelProperty(value ="副标题2" )
+ private String subtitle2;
@ApiModelProperty(value ="项目id" )
@NotBlank(message = "请选择项目id!")
private String xmId;
+ @ApiModelProperty(value ="单位名称" )
+ private String dwname;
- @ApiModelProperty(value ="封尾图片" )
- @NotBlank(message = "封尾图片不能为空!")
- private String tailingImg;
-
+ @ApiModelProperty(value ="联系人" )
+ private String lxname;
+
+ @ApiModelProperty(value ="手机号" )
+ private String phone;
+
+ @ApiModelProperty(value ="日期" )
+ private String date;
- @ApiModelProperty(value ="封尾标题" )
- private String tail;
+ @ApiModelProperty(value ="地址" )
+ private String address;
@ApiModelProperty(value ="项目名称数组" )
@TableField(exist = false)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/JgysbabResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/JgysbabResponse.java
new file mode 100644
index 0000000..3990ef4
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/JgysbabResponse.java
@@ -0,0 +1,52 @@
+package com.ruoyi.gysl.entity.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 建筑工程竣工验收备案表
+ * @author du
+ * @since 2025/5/21 下午2:30
+ */
+@Data
+public class JgysbabResponse {
+
+ @ApiModelProperty(value ="证照颁发日期" )
+ private String ZZBFRQ;
+
+ @ApiModelProperty(value ="证照颁发机构" )
+ private String ZZBFJG;
+
+ @ApiModelProperty(value ="证照有效期截至日期" )
+ private String ZZYXQJZRQ;
+
+ @ApiModelProperty(value ="持证主体代码类型代码" )
+ private String CZZTDMLXDM;
+
+ @ApiModelProperty(value ="持证主体代码" )
+ private String CZZTDM;
+
+ @ApiModelProperty(value ="证照编号" )
+ private String ZZBH;
+
+ @ApiModelProperty(value ="持证主体" )
+ private String CZZT;
+
+ @ApiModelProperty(value ="证照文件流" )
+ private String pdfBase64;
+
+ @ApiModelProperty(value ="持证主体代码类型" )
+ private String CZZTDMLX;
+
+ @ApiModelProperty(value ="证照有效期起始日期" )
+ private String ZZYXQQSRQ;
+
+ @ApiModelProperty(value ="证照标识" )
+ private String ZZBS;
+
+ @ApiModelProperty(value ="证照名称" )
+ private String ZZMC;
+
+ @ApiModelProperty(value ="证照颁发机构代码" )
+ private String ZZBFJGDM;
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/controller/SingleLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/controller/SingleLoginController.java
index a26b1f9..9957cd6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/controller/SingleLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/controller/SingleLoginController.java
@@ -6,20 +6,14 @@ package com.ruoyi.gysl.login.controller;
*/
import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.gysl.login.dto.response.UserMainResponse;
import com.ruoyi.gysl.login.dto.response.UserResponse;
import com.ruoyi.gysl.login.service.LoginTokenService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -43,7 +37,8 @@ import java.util.Map;
@RestController
@RequestMapping("/system/singlelogin")
public class SingleLoginController {
- private static final Logger log = LoggerFactory.getLogger(SingleLoginController.class);
+
+ private static final String BOUNDARY = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; // 边界字符串(需唯一)
@Value("${url}")
private String url;
@@ -57,8 +52,6 @@ public class SingleLoginController {
@Value("${returnUrl}")
private String returnUrl;
- @Resource
- private RedisCache redisCache;
@Resource
private LoginTokenService loginTokenService;
@@ -96,42 +89,47 @@ public class SingleLoginController {
@ApiOperation(value = "获取用户信息", response = UserResponse.class)
@GetMapping("/getInfo")
public AjaxResult getInfo(String clientToken) throws Exception {
- HttpResponse response = HttpUtil.createGet(infoUrl)
- .form("clienttoken", clientToken)
-// .addHeaders(generationHeader())
+ String url = infoUrl + "?clienttoken=" + clientToken;
+ HttpResponse response = HttpRequest.get(URLEncoder.encode(url, "UTF-8"))
+ .addHeaders(generationHeader())
.execute();
- String responseBody;
+ System.out.println(url);
+ System.out.println("appid:"+enterpriseAppId);
+ System.out.println("time:"+generationHeader().get("time"));
+ System.out.println("sign:"+generationHeader().get("sign"));
+ System.out.println(response.body());
+
+
+// String responseBody;
// 获取响应状态码
- int statusCode = response.getStatus();
- if (statusCode == 200) {
- // 获取响应内容
- responseBody = response.body();
- JSONObject jsonObj = JSONUtil.parseObj(responseBody);
- JSONObject dataObj = jsonObj.getJSONObject("data");
- // 设置过期时间(可选)
-// int expirationSeconds = 24 * 60;
- // 将用户信息存储到Redis中
-// String key = "user:" + clientToken;
- //判断是法人用户
- if ("ep".equals(dataObj.get("usertype"))) {
- JSONObject mainobj = dataObj.getJSONObject("mainbody");
- UserResponse res = JSONUtil.toBean(dataObj, UserResponse.class);
- UserMainResponse req = JSONUtil.toBean(mainobj, UserMainResponse.class);
- String token = loginTokenService.singleLogin(req.getUscc(), req.getEpname(),
- "02", null, null);
- res.setToken(token);
- res.setMain(req);
- return AjaxResult.success(res);
- } else {
- log.error(response.body());
- throw new ServiceException("该用户不是企业法人");
- }
- } else {
- log.error(response.body());
- throw new ServiceException("未知异常请联系管理员");
- }
+// int statusCode = response.getStatus();
+// if (statusCode == 200) {
+// // 获取响应内容
+// responseBody = response.body();
+// JSONObject jsonObj = JSONUtil.parseObj(responseBody);
+// JSONObject dataObj = jsonObj.getJSONObject("data");
+// //判断是法人用户
+// if ("ep".equals(dataObj.get("usertype"))) {
+// JSONObject mainobj = dataObj.getJSONObject("mainbody");
+// UserResponse res = JSONUtil.toBean(dataObj, UserResponse.class);
+// UserMainResponse req = JSONUtil.toBean(mainobj, UserMainResponse.class);
+// String token = loginTokenService.singleLogin(req.getUscc(), req.getEpname(),
+// "02", null, null);
+// res.setToken(token);
+// res.setMain(req);
+// return AjaxResult.success(res);
+// } else {
+// log.error(response.body());
+// throw new ServiceException("该用户不是企业法人");
+// }
+// } else {
+// log.error(response.body());
+// throw new ServiceException("未知异常请联系管理员");
+// }
+ return null;
}
+
/**
* 退出登录
*
@@ -143,7 +141,7 @@ public class SingleLoginController {
public AjaxResult enterpriseLogout(@RequestParam("clienttoken") String clienttoken) {
String url = logoutUrl + "?clienttoken=" + clienttoken;
HttpResponse execute = HttpUtil.createGet(url)
-// .addHeaders(generationHeader())
+ .addHeaders(generationHeader())
.execute();
String str;
// 获取响应状态码
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/util/StringUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/util/StringUtil.java
new file mode 100644
index 0000000..4d49ea3
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/login/util/StringUtil.java
@@ -0,0 +1,163 @@
+package com.ruoyi.gysl.login.util;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.gysl.entity.response.JgysbabResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 签名验证
+ *
+ * @author du
+ * @since 2024/6/20 10:15
+ */
+public class StringUtil {
+ public static void main(String[] args) {
+
+ }
+
+ public static List getFinalData(String content) throws Exception {
+ String result = content.replaceAll(", pdfBase64=[^,}]*", "");
+ //pdfbase64保存的集合
+ List segments = new ArrayList<>();
+ Pattern pattern = Pattern.compile(", pdfBase64=([^,]+)");
+ Matcher matcher = pattern.matcher(content);
+ while (matcher.find()) {
+ segments.add(matcher.group(1));
+ }
+ JSONObject newS = JSONObject.parseObject(result);
+ // 1. 分割多个对象
+ List objects = splitObjects(newS.getString("data"));
+ List jsonObjects = new ArrayList<>();
+ // 2. 遍历每个对象并解析
+ for (String obj : objects) {
+ jsonObjects.add(parseObject(obj));
+ }
+ // 3. 构建最终 JSON 数组
+ String json = buildJsonArray(jsonObjects);
+ JSONArray newArray = JSONArray.parseArray(json);
+ // 转换为 Java 对象列表
+ List returnData = new ArrayList<>();
+ for (int i = 0; i < newArray.size(); i++) {
+ JSONObject item = newArray.getJSONObject(i);
+ JgysbabResponse res = item.toJavaObject(JgysbabResponse.class);
+ res.setPdfBase64(segments.get(i));
+ returnData.add(res);
+ }
+ return returnData;
+ }
+
+ /**
+ * 分割输入字符串中的多个对象(支持嵌套结构)
+ */
+ private static List splitObjects(String input) {
+ List objects = new ArrayList<>();
+ int start = input.indexOf('{') + 1;
+ int depth = 0;
+ StringBuilder currentObj = new StringBuilder();
+
+ for (int i = start; i < input.length(); i++) {
+ char c = input.charAt(i);
+ if (c == '{') depth++;
+ if (c == '}') {
+ if (depth == 0) {
+ objects.add(currentObj.toString());
+ currentObj.setLength(0);
+ i++; // 跳过下一个逗号或闭合括号
+ } else {
+ depth--;
+ }
+ }
+ if (depth >= 0) currentObj.append(c);
+ }
+ return objects;
+ }
+
+ /**
+ * 解析单个对象
+ */
+ private static String parseObject(String objStr) {
+ List keyValuePairs = new ArrayList<>();
+ StringBuilder key = new StringBuilder();
+ StringBuilder value = new StringBuilder();
+ boolean isKey = true;
+ boolean inQuotes = false;
+ for (int i = 0; i < objStr.length(); i++) {
+ char c = objStr.charAt(i);
+ // 处理转义字符
+ if (c == '\\' && i < objStr.length() - 1) {
+ char next = objStr.charAt(++i);
+ if (isKey) key.append(next);
+ else value.append(next);
+ continue;
+ }
+ // 处理引号
+ if (c == '"') {
+ inQuotes = !inQuotes;
+ continue;
+ }
+ // 键值分隔符(不在引号内)
+ if (c == '=' && !inQuotes && isKey) {
+ isKey = false;
+ continue;
+ }
+ // 键值对结束符(不在引号内)
+ if (c == ',' && !inQuotes) {
+ keyValuePairs.add(new String[]{key.toString().trim(), value.toString().trim()});
+ key.setLength(0);
+ value.setLength(0);
+ isKey = true;
+ continue;
+ }
+ // 积累字符
+ if (isKey) key.append(c);
+ else value.append(c);
+ }
+
+ // 添加最后一个键值对
+ if (key.length() > 0) {
+ keyValuePairs.add(new String[]{key.toString().trim(), value.toString().trim()});
+ }
+
+ return buildJsonObject(keyValuePairs);
+ }
+
+ /**
+ * 构建单个 JSON 对象
+ */
+ private static String buildJsonObject(List pairs) {
+ StringBuilder json = new StringBuilder("{");
+ for (int i = 0; i < pairs.size(); i++) {
+ String[] pair = pairs.get(i);
+ json.append('"')
+ .append(pair[0])
+ .append("\":\"")
+ .append(pair[1].replace("\"", "\\\"")) // 处理值中的双引号
+ .append('"');
+ if (i < pairs.size() - 1) json.append(",");
+ }
+ return json.append("}").toString();
+ }
+
+ /**
+ * 构建最终 JSON 数组
+ */
+ private static String buildJsonArray(List objects) {
+ StringBuilder json = new StringBuilder("[");
+ for (int i = 0; i < objects.size(); i++) {
+ json.append(objects.get(i));
+ if (i < objects.size() - 1) json.append(",");
+ }
+ return json.append("]").toString();
+ }
+
+}
+
+
+
+
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java
index f2e9a77..bdc669f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java
@@ -11,7 +11,6 @@ import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.utils.PdfMerger;
import com.itextpdf.layout.font.FontProvider;
-import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -46,7 +45,6 @@ import java.util.*;
public class GyslProjectHandbookServiceImpl extends ServiceImpl implements GyslProjectHandbookService {
-
@Resource
private BasicInformationMapper basicInformationMapper;
@@ -84,10 +82,9 @@ public class GyslProjectHandbookServiceImpl extends ServiceImpl\n" +
+ "\t\t
\n" +
+ "\t"; // 要插入的内容
+ result.append(changeStr);
+ }
+ result.append(original.substring(insertPosition));
+ }
//获取当前的信息并替换为可用html
- String htmlNew = changeData(getHtml(htmlUrl), basicInfoList.get(i));
+ String htmlNew = changeData(String.valueOf(result), basicInfoList.get(i));
//新建pdf
String newPdf = "/pdfml" + "/p" + i + ".pdf";
String outputPath = RuoYiConfig.getProfile() + newPdf;
@@ -113,10 +130,13 @@ public class GyslProjectHandbookServiceImpl extends ServiceImpl sysDictData = sysDictDataMapper.selectDictDataList(new SysDictData());
Map dt = new HashMap<>();
- dt.put("{{fj}}", b.getBasicInformation().getFj() == null ?
- Paths.get(RuoYiConfig.getProfile() + "/OIP-C.jpg").toUri().toString()
- : Paths.get(RuoYiConfig.getProfile() + b.getBasicInformation().getFj()).toUri().toString());
+ if (b.getBasicInformation().getFj() != null) {
+ String[] split = b.getBasicInformation().getFj().split(",");
+ for (int i = 0; i < split.length; i++) {
+ dt.put("{{fjimg"+i+"}}",
+ Paths.get(RuoYiConfig.getProfile() + StringUtils.substringAfter(split[i], Constants.RESOURCE_PREFIX)).toUri().toString());
+ }
+ }
dt.put("{{name}}", b.getBasicInformation().getName());
dt.put("{{ztze}}", b.getBasicInformation().getZtze());
dt.put("{{xmbq}}", b.getBasicInformation().getLabel());
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index 37a9784..a605116 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -61,10 +61,18 @@ spring:
multi-statement-allow: true
# 是否是正式环境
isZs: false
+
+
+#企业端单点登陆url
+url: http://114.216.202.175:8008/api/usercenter/User/ssoLogin
+#企业端用户信息url
+infoUrl: http://114.216.202.175:8008/api/usercenter/User/getInfo
+#企业端退出登录url
+logoutUrl: http://114.216.202.175:8008/api/usercenter/User/ssoLogOut
#企业端正式环境应用系统编号
enterpriseAppId: 193d64ab-316e-11f0-b7ab-9c5c8e847e61
# 应用私钥
enterpriseAppsecret: 7C21B5B9316E11F0B7AB9C5C8E847E61
#自己客户端地址
-returnUrl: http://192.168.0.119:80
-#returnUrl: http://39.101.188.84:9999/demo/Gyyq-Upstairs/
+#returnUrl: http://192.168.0.119:80
+returnUrl: http://39.101.188.84:9999/demo/Gyyq-Upstairs/
diff --git a/ruoyi-admin/src/main/resources/application-internet.yml b/ruoyi-admin/src/main/resources/application-internet.yml
index b8b83ff..daf2ec7 100644
--- a/ruoyi-admin/src/main/resources/application-internet.yml
+++ b/ruoyi-admin/src/main/resources/application-internet.yml
@@ -116,6 +116,13 @@ swagger:
pathMapping: /
# 是否是正式环境
isZs: true
+
+#企业端单点登陆url
+url: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogin
+#企业端用户信息url
+infoUrl: http://172.21.14.70/api/usercenter/User/getInfo
+#企业端退出登录url
+logoutUrl: http://172.21.14.70/api/usercenter/User/ssoLogOut
#企业端正式环境应用系统编号
enterpriseAppId: 193d64ab-316e-11f0-b7ab-9c5c8e847e61
# 应用私钥
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index ca24875..e3ecfc8 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -52,7 +52,7 @@ spring:
# 国际化资源文件路径
basename: i18n/messages
profiles:
- active: druid
+ active: internet
# 文件上传
servlet:
multipart:
@@ -141,14 +141,7 @@ getInfoId: https://172.21.10.12/enterprise-gateway/sipsg-enterprise/sys/third/us
getAllInfo: http://172.21.10.14/open/api/identity/data/FindUserById
-#企业端单点登陆url
-#url: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogin
-url: http://114.216.202.175:8008/api/usercenter/User/ssoLogin
-#企业端用户信息url
-#infoUrl: https://qytt.sipac.gov.cn/api/usercenter/User/getInfo
-infoUrl: http://114.216.202.175:8008/api/usercenter/User/getInfo
-#企业端退出登录url
-#logoutUrl: https://qytt.sipac.gov.cn/api/usercenter/User/ssoLogOut
-logoutUrl: http://114.216.202.175:8008/api/usercenter/User/ssoLogOut
-
-
+sm4: ef5323158e0d43e69442718cd4932116
+sm2: MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgefIcY79Be48T8ryF9tMOKDFZ4XmeB9JzBSmEZHGmvhKhRANCAAQmjPisOvJfv2r7mpj06FszOkAlJiyVL6OoefMmXmqSANNqyT8ZxnFpnToYgtqjQqX44IG8fXk49eLjKXQSfJ2J
+accessId: d8bc5ba2-7114-46aa-b4e0-141804e4df1c
+sceneId: 202505210001
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml
index 032218b..ca28cdf 100644
--- a/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml
+++ b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml
@@ -367,6 +367,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
@@ -402,6 +403,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ group by a.id
order by a.create_time desc
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index cbbd425..43c1222 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -117,8 +117,8 @@ public class SecurityConfig
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
.antMatchers("/system/chief/**").permitAll()
.antMatchers("/system/singlelogin/**").permitAll()
-// .antMatchers("/gysl/Cybq/getCybq").permitAll()
-
+ .antMatchers("/gysl/basicInformation/**").permitAll()
+ .antMatchers("/gysl/handbook/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index 39f26df..a0c05db 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -73,7 +73,7 @@ public class SysLoginService {
*/
public String login(String username, String password, String code, String uuid, Integer loginRole) {
// 验证码校验
-// validateCaptcha(username, code, uuid);
+// validateCaptcha(username, code, uuid);
// 登录前置校验
String strP;
try {