From ab4f5aafb0d7b6d77a3108a6fb7084219c56a1cf Mon Sep 17 00:00:00 2001
From: peter <14100000001@qq.com>
Date: Sun, 11 Jan 2026 04:14:56 +0800
Subject: [PATCH] 签章
---
src/main/resources/application.properties | 35 +++---
src/main/java/com/nq/service/IUserAgreementService.java | 3
src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java | 219 ++++++++++++-------------------------------
src/main/java/com/nq/controller/protol/UserController.java | 5
src/main/resources/application.yml | 10 +-
src/main/java/com/nq/service/impl/UserServiceImpl.java | 27 +++-
6 files changed, 106 insertions(+), 193 deletions(-)
diff --git a/src/main/java/com/nq/controller/protol/UserController.java b/src/main/java/com/nq/controller/protol/UserController.java
index 5097142..b0ede84 100644
--- a/src/main/java/com/nq/controller/protol/UserController.java
+++ b/src/main/java/com/nq/controller/protol/UserController.java
@@ -484,8 +484,9 @@
* 查看用户协议PDF
*/
@RequestMapping({"viewAgreementPdf.do"})
- public void viewAgreementPdf(HttpServletRequest request, HttpServletResponse response) {
- this.iUserAgreementService.viewAgreementPdf(request, response);
+ @ResponseBody
+ public ServerResponse viewAgreementPdf(HttpServletRequest request) {
+ return this.iUserAgreementService.viewAgreementPdf(request);
}
/**
diff --git a/src/main/java/com/nq/service/IUserAgreementService.java b/src/main/java/com/nq/service/IUserAgreementService.java
index cf55243..360e6e7 100644
--- a/src/main/java/com/nq/service/IUserAgreementService.java
+++ b/src/main/java/com/nq/service/IUserAgreementService.java
@@ -18,10 +18,9 @@
/**
* 查看用户协议PDF(返回图片路径列表)
* @param request
- * @param response
* @return
*/
- void viewAgreementPdf(HttpServletRequest request, HttpServletResponse response);
+ ServerResponse viewAgreementPdf(HttpServletRequest request);
/**
* 保存用户协议签名
diff --git a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
index 88a9f23..648c15e 100644
--- a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
@@ -70,11 +70,8 @@
dir.mkdirs();
}
- String pdfFileName = "agreement_" + user.getId() + ".pdf";
+ String pdfFileName = "contract_" + user.getId() + ".pdf";
File pdfFile = new File(dir, pdfFileName);
-
- // 构建完整的PDF访问URL
-// String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/agreement_" + user.getId() + ".pdf";
// 如果PDF已存在,删除后重新生成,确保数据是最新的
if (pdfFile.exists()) {
@@ -109,7 +106,7 @@
*/
private void generatePdfFromTemplate(File templatePdf, File outputPdf, User user) throws Exception {
log.info("开始生成PDF,模板路径: {}, 输出路径: {}, 用户: {}",
- templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId());
+ templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId());
PdfReader reader = null;
PdfStamper stamper = null;
@@ -354,37 +351,28 @@
}
@Override
- public void viewAgreementPdf(HttpServletRequest request, HttpServletResponse response) {
+ public ServerResponse viewAgreementPdf(HttpServletRequest request) {
try {
User user = iUserService.getCurrentUser(request);
if (user == null) {
- response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "用户未登录");
- return;
+ return ServerResponse.createByErrorMsg("用户未登录");
}
- String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
- String pdfFileName = "agreement_" + user.getId() + ".pdf";
- File pdfFile = new File(pdfDir, pdfFileName);
-
- if (!pdfFile.exists()) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND, "协议文件不存在,请先生成协议");
- return;
+ // 从数据库查询已签名的图片
+ List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "contract");
+ List<String> imageUrls = new ArrayList<>();
+
+ if (contractImages != null && !contractImages.isEmpty()) {
+ for (ContractImage image : contractImages) {
+ imageUrls.add(image.getAddress());
+ }
+ log.info("从数据库查询到用户{}的{}张已签名合同图片", user.getId(), imageUrls.size());
}
- List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId());
-
- response.setContentType("application/json;charset=UTF-8");
- response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls)));
- response.getWriter().flush();
+ return ServerResponse.createBySuccess(imageUrls);
} catch (Exception e) {
log.error("查看用户协议PDF失败", e);
- try {
- if (!response.isCommitted()) {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "查看PDF失败: " + e.getMessage());
- }
- } catch (IOException ex) {
- log.error("发送错误响应失败", ex);
- }
+ return ServerResponse.createByErrorMsg("查看PDF失败: " + e.getMessage());
}
}
@@ -414,34 +402,21 @@
log.info("用户{}的签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath());
String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
- String pdfFileName = "agreement_" + user.getId() + ".pdf";
+ String pdfFileName = "contract_" + user.getId() + ".pdf";
File pdfFile = new File(pdfDir, pdfFileName);
-
+ //删之前的图片
+ deleteFilesWithPattern(pdfDir,"contract_" + user.getId());
if (pdfFile.exists()) {
addSignatureToPdf(pdfFile, signatureFileLocal, user);
-
List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId());
-
- String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix");
- long timestamp = System.currentTimeMillis();
-
- for (int i = 0; i < imageUrls.size(); i++) {
- String imageName;
- if (i == 0) {
- imageName = "contract_" + timestamp + ".png";
- } else {
- imageName = "contract_" + timestamp + "_" + (i + 1) + ".png";
- }
- String imagePath = imagePrefix + "/" + imageName;
-
+ for(String imageUrl : imageUrls) {
ContractImage contractImage = new ContractImage();
contractImage.setUserId(user.getId());
contractImage.setContractType("contract");
- contractImage.setAddress(imagePath);
+ contractImage.setAddress(imageUrl);
contractImage.setAddTime(new Date());
contractImageMapper.insert(contractImage);
}
-
iUserService.updateSignedContract(user.getId(), "Y");
}
return ServerResponse.createBySuccessMsg("签名保存成功");
@@ -498,7 +473,7 @@
return ServerResponse.createByErrorMsg("用户未登录");
}
- if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) {
+ if (user.getIsActive()!=2 || StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) {
return ServerResponse.createByErrorMsg("用户信息不完整,请先完成实名认证");
}
@@ -508,10 +483,8 @@
dir.mkdirs();
}
- String pdfFileName = "contract_" + user.getId() + ".pdf";
+ String pdfFileName = "agreement_" + user.getId() + ".pdf";
File pdfFile = new File(dir, pdfFileName);
-
- String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/contract_" + user.getId() + ".pdf";
if (pdfFile.exists()) {
boolean deleted = pdfFile.delete();
@@ -547,16 +520,16 @@
return;
}
- String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
- String pdfFileName = "contract_" + user.getId() + ".pdf";
- File pdfFile = new File(pdfDir, pdfFileName);
-
- if (!pdfFile.exists()) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND, "合同文件不存在,请先生成合同");
- return;
+ // 从数据库查询已签名的图片
+ List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "agreement");
+ List<String> imageUrls = new ArrayList<>();
+
+ if (contractImages != null && !contractImages.isEmpty()) {
+ for (ContractImage image : contractImages) {
+ imageUrls.add(image.getAddress());
+ }
+ log.info("从数据库查询到用户{}的{}张已签名保密协议图片", user.getId(), imageUrls.size());
}
-
- List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId());
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls)));
@@ -591,7 +564,7 @@
dir.mkdirs();
}
- String signatureFileName = "contract_signature_" + user.getId() + ".png";
+ String signatureFileName = "agreement_signature_" + user.getId() + ".png";
File signatureFileLocal = new File(dir, signatureFileName);
signatureFile.transferTo(signatureFileLocal);
@@ -599,34 +572,22 @@
log.info("用户{}的合同签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath());
String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
- String pdfFileName = "contract_" + user.getId() + ".pdf";
+ String pdfFileName = "agreement_" + user.getId() + ".pdf";
File pdfFile = new File(pdfDir, pdfFileName);
-
+ //删之前的图片
+ deleteFilesWithPattern(pdfDir,"agreement_" + user.getId());
if (pdfFile.exists()) {
addSignatureToContractPdf(pdfFile, signatureFileLocal, user);
List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId());
-
- String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix");
- long timestamp = System.currentTimeMillis();
-
- for (int i = 0; i < imageUrls.size(); i++) {
- String imageName;
- if (i == 0) {
- imageName = "agreement_" + timestamp + ".png";
- } else {
- imageName = "agreement_" + timestamp + "_" + (i + 1) + ".png";
- }
- String imagePath = imagePrefix + "/" + imageName;
-
+ for (String imageUrl : imageUrls) {
ContractImage contractImage = new ContractImage();
contractImage.setUserId(user.getId());
contractImage.setContractType("agreement");
- contractImage.setAddress(imagePath);
+ contractImage.setAddress(imageUrl);
contractImage.setAddTime(new Date());
contractImageMapper.insert(contractImage);
}
-
iUserService.updateSignedAgreement(user.getId(), "Y");
}
@@ -662,7 +623,7 @@
private void replacePlaceholdersInContractPdf(PdfContentByte canvas, Rectangle pageSize, String currentDate, Font font, int pageNum) throws Exception {
float margin = 50;
- float startY = pageSize.getHeight() - 364;
+ float startY = pageSize.getHeight() - 374;
if(pageNum == 2){
// 生成透明背景的日期图片并插入
File dateImage = createTextImage(currentDate, font);
@@ -730,85 +691,6 @@
return null;
}
}
-
- public static void main(String[] args) {
- try {
- String pdfDir = "D:/work/A-stock/agreement_pdf";
- String pdfFileName = "agreement_" + 19998 + ".pdf";
- File pdfFile = new File(pdfDir, pdfFileName);
- convertPdfToImages1(pdfFile,"agreement");
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- /**
- * 将PDF转换为图片
- */
- public static void convertPdfToImages1(File pdfFile, String contractType) throws Exception {
- List<String> imageUrls = new ArrayList<>();
- String imagePrefix = "http://localhost:8099";
- String pdfDir = "D:/work/A-stock/agreement_pdf";
-
- long timestamp = System.currentTimeMillis();
- PDDocument document = null;
- try {
- document = PDDocument.load(pdfFile);
-
- // 创建PDFRenderer,使用高质量渲染
- PDFRenderer pdfRenderer = new PDFRenderer(document);
-
- int pageCount = document.getNumberOfPages();
- log.info("PDF总页数: {}", pageCount);
-
- for (int page = 0; page < pageCount; page++) {
- // 使用RGB模式渲染,DPI设置为300确保文字清晰
- // ImageType.RGB可以更好地处理中文字体
- BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
-
- // 对图片进行优化处理,确保文字清晰
- BufferedImage optimizedImage = optimizeImage1(image);
-
- String imageFileName = contractType + "_" + timestamp + ".png";
- if (page > 0) {
- imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png";
- }
- File imageFile = new File(pdfDir, imageFileName);
-
- ImageIO.write(optimizedImage, "png", imageFile);
-
- String imageUrl = imagePrefix + "/imgs/" + imageFileName;
- imageUrls.add(imageUrl);
-
- log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl);
- }
- } finally {
- if (document != null) {
- document.close();
- }
- }
-
-// return imageUrls;
- }
-
- public static BufferedImage optimizeImage1(BufferedImage originalImage) {
- int width = originalImage.getWidth();
- int height = originalImage.getHeight();
-
- BufferedImage optimizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- Graphics2D g2d = optimizedImage.createGraphics();
-
- // 设置高质量渲染
- g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
-
- g2d.drawImage(originalImage, 0, 0, null);
- g2d.dispose();
-
- return optimizedImage;
- }
/**
* 将PDF转换为图片
*/
@@ -836,15 +718,15 @@
// 对图片进行优化处理,确保文字清晰
BufferedImage optimizedImage = optimizeImage(image);
- String imageFileName = contractType + "_" + timestamp + ".png";
+ String imageFileName = contractType + "_" +userId +"_" + timestamp + ".png";
if (page > 0) {
- imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png";
+ imageFileName = contractType+ "_" + userId + "_" + timestamp + "_" + (page + 1) + ".png";
}
File imageFile = new File(pdfDir, imageFileName);
ImageIO.write(optimizedImage, "png", imageFile);
- String imageUrl = imagePrefix + "/imgs/" + imageFileName;
+ String imageUrl = imagePrefix + "/" + imageFileName;
imageUrls.add(imageUrl);
log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl);
@@ -922,4 +804,23 @@
return ServerResponse.createByErrorMsg("查询失败:" + e.getMessage());
}
}
+
+ public void deleteFilesWithPattern(String dirPath, String userId) {
+ File directory = new File(dirPath);
+ if (!directory.exists() || !directory.isDirectory()) {
+ System.out.println("目录不存在或路径错误: " + dirPath);
+ return;
+ }
+
+ File[] files = directory.listFiles((dir, name) -> name.contains(userId + "_"));
+ if (files != null) {
+ for (File file : files) {
+ if (file.delete()) {
+ System.out.println("已删除文件: " + file.getName());
+ } else {
+ System.out.println("删除失败: " + file.getName());
+ }
+ }
+ }
+ }
}
diff --git a/src/main/java/com/nq/service/impl/UserServiceImpl.java b/src/main/java/com/nq/service/impl/UserServiceImpl.java
index 39759a0..cfbc8b4 100644
--- a/src/main/java/com/nq/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -118,10 +118,10 @@
}
- String keys = "AliyunSmsCode:" + phone;
- String redis_yzm = RedisShardedPoolUtils.get(keys);
-
- log.info("redis_yzm = {},yzmCode = {}", redis_yzm, yzmCode);
+// String keys = "AliyunSmsCode:" + phone;
+// String redis_yzm = RedisShardedPoolUtils.get(keys);
+//
+// log.info("redis_yzm = {},yzmCode = {}", redis_yzm, yzmCode);
// if (!yzmCode.equals(redis_yzm) && !"6666".equals(yzmCode)) {
// return ServerResponse.createByErrorMsg("注册失败, 验证码错误");
// }
@@ -154,10 +154,19 @@
user.setIsActive(Integer.valueOf(0));
user.setRegTime(new Date());
- String uip = IpUtils.getIp(request);
- user.setRegIp(uip);
- String uadd = JuheIpApi.ip2Add(uip);
-// user.setRegAddress(uadd);
+// String uip = IpUtils.getIp(request);
+// user.setRegIp(uip);
+// // IP地址查询改为异步处理,避免阻塞注册接口
+// final String finalUip = uip;
+// final String finalPhone = phone;
+// new Thread(() -> {
+// try {
+// String uadd = JuheIpApi.ip2Add(finalUip);
+// log.info("用户注册IP地址查询完成 手机 {} , ip = {} 地址 = {}", finalPhone, finalUip, uadd);
+// } catch (Exception e) {
+// log.error("IP地址查询异常", e);
+// }
+// }).start();
user.setIsLogin(Integer.valueOf(0));
@@ -183,7 +192,7 @@
String newAgentCode = generateUniqueAgentCode();
agentUser.setAgentCode(newAgentCode);
iAgentUserService.updateAgentCode(agentUser);
- log.info("用户注册成功 手机 {} , ip = {} 地址 = {}", new Object[] { phone, uip, uadd });
+ log.info("用户注册成功 手机 {} , ip = {}", phone, "123123");
return ServerResponse.createBySuccessMsg("注册成功.请登录");
}
return ServerResponse.createBySuccessMsg("注册出错, 请重试");
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 36e722f..2db9183 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -10,22 +10,28 @@
ftp.pass=ftp_red
ftp.server.http.prefix=https://ftp.shengliankeji.top/
loca.images.dir=/www/wwwroot/ftp.shengliankeji.top/
-#??
-#pdf.server.http.prefix=https://stockapdf.shengliankeji.top
-#??
-pdf.server.http.prefix=http://localhost:8099
-#??
-#loca.pdf.dir=/www/wwwroot/stock.A.PDF
-#??
-loca.pdf.dir=D:/work/A-stock/agreement_pdf
-#??
-#pdf.template.dir=/www/wwwroot/ftp.shengliankeji.top/templates
-#??
-pdf.template.dir=D:/work/A-stock/src/main/resources/templates
+#????????????--??
+pdf.server.http.prefix=https://stockapdf.shengliankeji.top
+#????????????--??
+#pdf.server.http.prefix=http://localhost:8099/imgs
+#????????--??
+loca.pdf.dir=/www/wwwroot/stock.A.PDF
+#????????--??
+#loca.pdf.dir=D:/work/A-stock/agreement_pdf
+#????--??
+pdf.template.dir=/www/wwwroot/ftp.shengliankeji.top/templates
+#????--??
+#pdf.template.dir=D:/work/A-stock/src/main/resources/templates
#ftp.server.ip=47.56.200.145
#ftp.user=ofsuccess
#ftp.pass=fdymdM34HHsS8iB6
#ftp.server.http.prefix=http://www.img.yfkgzq.com/
+#??
+sina.single.stock.sort.proxy.url=http://103.30.7.134:7001/crypto/getStockSort.do?
+sina.single.stock.proxy.url=http://103.30.7.134:7001/crypto/getSinaStock?stockGid=
+#??
+#sina.single.stock.sort.proxy.url=http://localhost:7001/crypto/getStockSort.do?
+#sina.single.stock.proxy.url=http://localhost:7001/crypto/getSinaStock?stockGid=
# redis config start
redis1.ip=localhost
@@ -93,10 +99,7 @@
sina.index.market.url=https://ws.api.cnyes.com/ws/api/v4/universal/quote?type=LITQ&column=L
sina.single.stock.url=https://hq.sinajs.cn/list=
-sina.single.stock.sort.proxy.url=http://103.30.7.134:7001/crypto/getStockSort.do?
-sina.single.stock.proxy.url=http://103.30.7.134:7001/crypto/getSinaStock?stockGid=
-#sina.single.stock.sort.proxy.url=http://localhost:7001/crypto/getStockSort.do?
-#sina.single.stock.proxy.url=http://localhost:7001/crypto/getSinaStock?stockGid=
+
#????
sina.single.stock.introduction.url=https://quotes.sina.cn/cn/api/openapi.php/CompanyF10Service.getCompanyInformation?market=cn&symbol=
nq.single.stock.url=http://192.168.10.5/stock/?type=
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index b35528f..c7fc417 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -104,12 +104,12 @@
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://127.0.0.1:3306/stock_hongta_101?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
- username: root
- password: 123456
# url: jdbc:mysql://127.0.0.1:3306/stock_hongta_101?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-# username: stock_hongta_101
-# password: mFi7EZKGmnJFh8at
+# username: root
+# password: 123456
+ url: jdbc:mysql://127.0.0.1:3306/stock_hongta_101?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ username: stock_hongta_101
+ password: mFi7EZKGmnJFh8at
druid:
# 初始连接数
initialSize: 5
--
Gitblit v1.9.3