From 95b2c04a9d62fbcfdc4ad5b88920966e552a0681 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B5=B7=E5=AE=81?= <15600600491@163.com>
Date: Sun, 7 Apr 2024 17:33:40 +0800
Subject: [PATCH] Remove .idea folder
---
.idea/.gitignore | 8 -
.idea/compiler.xml | 35 ---
.idea/encodings.xml | 13 --
.idea/jarRepositories.xml | 25 --
.idea/misc.xml | 16 --
.../main/java/com/xsnb/common/EventType.java | 3 +
.../java/com/xsnb/common/domain/XmlData.java | 2 +
.../common/exception/WechatException.java | 2 +
.../exception/WechatQrCodeException.java | 2 +
.../com/xsnb/common/utils/GyTelSmsUtils.java | 2 +
xsnb-invoiceManager/pom.xml | 20 ++
.../invoiceManager/InvoiceManagerMain.java | 2 +
.../xsnb/invoiceManager/config/NonoReq.java | 2 +
.../controller/IMController.java | 2 +
.../domain/InvoiceConstants.java | 2 +
.../src/main/resources/bootstrap.yml | 50 ++++
.../com/xsnb/system/config/MinioConfig.java | 26 +++
.../xsnb/system/config/WeChatCodeConfig.java | 28 +++
.../system/controller/FileController.java | 2 +
...omeController.java => MailController.java} | 0
.../system/controller/WechatController.java | 71 ++++++
.../com/xsnb/system/domain/WxUserLog.java | 2 +
.../xsnb/system/mapper/AttachmentMapper.java | 18 ++
.../xsnb/system/mapper/WxUserLogMapper.java | 2 +
.../xsnb/system/service/WechatService.java | 2 +
.../service/impl/WechatServiceImpl.java | 6 +
.../java/com/xsnb/system/utils/GzhUtiles.java | 209 +++++++++++++++++
.../java/com/xsnb/system/utils/HttpUtil.java | 167 +++++++++++++
.../xsnb/system/utils/minio/MinioUtil.java | 220 ++++++++++++++++++
29 files changed, 842 insertions(+), 97 deletions(-)
delete mode 100644 .idea/.gitignore
delete mode 100644 .idea/compiler.xml
delete mode 100644 .idea/encodings.xml
delete mode 100644 .idea/jarRepositories.xml
delete mode 100644 .idea/misc.xml
create mode 100644 xsnb-common/src/main/java/com/xsnb/common/EventType.java
create mode 100644 xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java
create mode 100644 xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java
create mode 100644 xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java
create mode 100644 xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java
create mode 100644 xsnb-invoiceManager/pom.xml
create mode 100644 xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java
create mode 100644 xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java
create mode 100644 xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java
create mode 100644 xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java
create mode 100644 xsnb-invoiceManager/src/main/resources/bootstrap.yml
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/MinioConfig.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/WeChatCodeConfig.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/FileController.java
rename xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/{DomeController.java => MailController.java} (100%)
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/WechatController.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/WxUserLog.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/AttachmentMapper.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/WxUserLogMapper.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/WechatService.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/WechatServiceImpl.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/GzhUtiles.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/HttpUtil.java
create mode 100644 xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/minio/MinioUtil.java
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 35410ca..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# 默认忽略的文件
-/shelf/
-/workspace.xml
-# 基于编辑器的 HTTP 客户端请求
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index 0fad9d5..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index d4d942a..0000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
deleted file mode 100644
index 40a2eee..0000000
--- a/.idea/jarRepositories.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index f095382..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/xsnb-common/src/main/java/com/xsnb/common/EventType.java b/xsnb-common/src/main/java/com/xsnb/common/EventType.java
new file mode 100644
index 0000000..c152edd
--- /dev/null
+++ b/xsnb-common/src/main/java/com/xsnb/common/EventType.java
@@ -0,0 +1,3 @@
+package com.ruoyi.web.controller.gzh.domin;
+
+public enum EventType {}
diff --git a/xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java b/xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java
new file mode 100644
index 0000000..c1f91f4
--- /dev/null
+++ b/xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java
@@ -0,0 +1,2 @@
+package com.xsnb.common.domain;public class XmlData {
+}
diff --git a/xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java
new file mode 100644
index 0000000..13b2ad7
--- /dev/null
+++ b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java
@@ -0,0 +1,2 @@
+package com.xsnb.common.exception;public class WechatException {
+}
diff --git a/xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java
new file mode 100644
index 0000000..b946b40
--- /dev/null
+++ b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java
@@ -0,0 +1,2 @@
+package com.xsnb.common.exception;public class WechatQrCodeException {
+}
diff --git a/xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java b/xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java
new file mode 100644
index 0000000..1fa501a
--- /dev/null
+++ b/xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java
@@ -0,0 +1,2 @@
+package com.xsnb.common.utils;public class GyTelSmsUtils {
+}
diff --git a/xsnb-invoiceManager/pom.xml b/xsnb-invoiceManager/pom.xml
new file mode 100644
index 0000000..8bcc7c1
--- /dev/null
+++ b/xsnb-invoiceManager/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ com.xsnb
+ xsnb-dev
+ 1.0.0
+
+
+ xsnb-invoiceManager
+
+
+ 17
+ 17
+ UTF-8
+
+
+
diff --git a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java
new file mode 100644
index 0000000..6124728
--- /dev/null
+++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java
@@ -0,0 +1,2 @@
+package com.xsnb.invoiceManager;public class InvoiceManagerMain {
+}
diff --git a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java
new file mode 100644
index 0000000..74504db
--- /dev/null
+++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java
@@ -0,0 +1,2 @@
+package com.xsnb.invoiceManager.config;public class NonoReq {
+}
diff --git a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java
new file mode 100644
index 0000000..f74ab3d
--- /dev/null
+++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java
@@ -0,0 +1,2 @@
+package com.xsnb.invoiceManager.controller;public class IMController {
+}
diff --git a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java
new file mode 100644
index 0000000..8431578
--- /dev/null
+++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java
@@ -0,0 +1,2 @@
+package com.xsnb.invoiceManager.domain;public class InvoiceConstants {
+}
diff --git a/xsnb-invoiceManager/src/main/resources/bootstrap.yml b/xsnb-invoiceManager/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..305b9bf
--- /dev/null
+++ b/xsnb-invoiceManager/src/main/resources/bootstrap.yml
@@ -0,0 +1,50 @@
+server:
+ port: 9002
+
+spring:
+ mail: # 邮件相关配置
+ username: xingsnbadmin@xingsnb.cn # 你自己的QQ邮箱的用户名,需要填写你的QQ邮箱地址
+ password: drjyrrmzqmjcbhdb # 你自己的QQ邮箱的密钥/密码,需要填写你的QQ邮箱登录密码
+ host: smtp.qq.com # SMTP服务器主机名,这里设置为QQ邮箱的SMTP服务器
+ port: 465 # SMTP服务器端口,通常情况下使用SSL的SMTP协议使用465端口
+ protocol: smtp # 使用SMTP协议发送邮件
+ properties: # 邮件相关的属性配置
+ mail: # 邮件协议属性配置
+ smtp: # SMTP协议属性配置
+ ssl: # SSL/TLS属性配置
+ enable: true # 启用SSL,表示使用加密传输邮件
+ auth: true # 启用SMTP身份验证,需要提供用户名和密码
+ starttls: # STARTTLS属性配置,用于在未加密连接上启用TLS
+ enable: true # 启用STARTTLS
+ required: true # 要求必须使用STARTTLS
+ socketFactory: # Socket工厂属性配置,用于SSL连接
+ port: 465 # SSL连接的端口,与SMTP服务器的端口一致
+ class: javax.net.ssl.SSLSocketFactory # 使用的Socket工厂类,通常用于SSL连接
+ main:
+ allow-bean-definition-overriding: true
+ allow-circular-references: true
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ application:
+ name: xsnb-system
+ profiles:
+ active: dev
+ cloud:
+ nacos:
+ discovery:
+ server-addr: 127.0.0.1:8848
+ config:
+ server-addr: 127.0.0.1:8848
+ file-extension: yml
+ shared-configs:
+ - "application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}"
+ rabbitmq:
+ host: 127.0.0.1
+ port: 5672
+ username: guest
+ password: guest
+ virtualHost: /
+ listener:
+ simple:
+ prefetch: 1
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/MinioConfig.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/MinioConfig.java
new file mode 100644
index 0000000..cb856dc
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/MinioConfig.java
@@ -0,0 +1,26 @@
+package com.xsnb.common.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfig {
+
+ private String endpoint;
+ private String accessKey;
+ private String secretKey;
+ private String bucketName;
+
+ @Bean
+ public MinioClient minioClient() {
+ return MinioClient.builder()
+ .endpoint(endpoint)
+ .credentials(accessKey, secretKey)
+ .build();
+ }
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/WeChatCodeConfig.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/WeChatCodeConfig.java
new file mode 100644
index 0000000..7166ad6
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/config/WeChatCodeConfig.java
@@ -0,0 +1,28 @@
+package com.xsnb.common.config;
+
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class WeChatCodeConfig {
+ @Value("${wx.appid}")
+ private String appId;
+ @Value("${wx.appsecret}")
+ private String appSecret;
+ /**
+ * 定义WxMpService bean
+ */
+ @Bean
+ public WxMpService wxMpService() {
+ WxMpService wxMpService = new WxMpServiceImpl();
+ WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
+ config.setAppId(appId);
+ config.setSecret(appSecret);
+ wxMpService.setWxMpConfigStorage(config);
+ return wxMpService;
+ }
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/FileController.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/FileController.java
new file mode 100644
index 0000000..738e1e1
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/FileController.java
@@ -0,0 +1,2 @@
+package com.xsnb.system.controller;public class FileController {
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/DomeController.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java
similarity index 100%
rename from xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/DomeController.java
rename to xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/WechatController.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/WechatController.java
new file mode 100644
index 0000000..1fe18bc
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/WechatController.java
@@ -0,0 +1,71 @@
+package com.xsnb.auth.controller;
+
+import com.xsnb.common.result.Result;
+import com.xsnb.auth.GzhUtiles;
+import com.xsnb.common.utils.HttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/weChat")
+public class WechatController {
+ @Autowired
+ GzhUtiles gzhUtiles;
+
+
+ private HttpUtil httpUtil;
+ @Autowired
+ public WechatController(HttpUtil httpUtil) {
+ this.httpUtil = httpUtil;
+ }
+
+
+ @GetMapping("/getLoginQrCode")
+ @ResponseBody
+ public Result getLoginQrCode(){
+
+ return Result.success(getQRCode(),"获取成功");
+ }
+
+ public Map getQRCode() {
+ try {
+ // 获取公众号 AccessToken
+ String gzhAccessToken = gzhUtiles.getToken();
+
+ // 构建请求URL
+ String createQRCodeUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + gzhAccessToken;
+
+ // 构建二维码数据
+ String jsonData = "{\"expire_seconds\": 600, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"login\"}}}";
+
+ // 发起POST请求获取二维码 ticket
+ Map ticketMap = httpUtil.doPost(createQRCodeUrl, jsonData, 600);
+ String ticket = String.valueOf(ticketMap.get("ticket"));
+
+ if (ticket != null) {
+
+ // 构建二维码显示URL
+ String codeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
+ HashMap wxMap = new HashMap<>();
+ wxMap.put("uuid", ticket);
+ wxMap.put("codeUrl", codeUrl);
+ return wxMap;
+ }
+ } catch (Exception e) {
+ // 发生异常时抛出自定义异常
+ throw new RuntimeException("公众号获取异常");
+ }
+
+ // 默认返回空 Map
+ return Collections.emptyMap();
+ }
+
+
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/WxUserLog.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/WxUserLog.java
new file mode 100644
index 0000000..98f3e91
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/WxUserLog.java
@@ -0,0 +1,2 @@
+package com.xsnb.system.domain;public class WxUserLog {
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/AttachmentMapper.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/AttachmentMapper.java
new file mode 100644
index 0000000..455faf5
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/AttachmentMapper.java
@@ -0,0 +1,18 @@
+package com.xsnb.system.mapper;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@TableName("attachment_list")
+public class Attachment {
+
+
+
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/WxUserLogMapper.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/WxUserLogMapper.java
new file mode 100644
index 0000000..22e09d7
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/WxUserLogMapper.java
@@ -0,0 +1,2 @@
+package com.xsnb.system.mapper;public interface WxUserLogMapper {
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/WechatService.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/WechatService.java
new file mode 100644
index 0000000..79169b0
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/WechatService.java
@@ -0,0 +1,2 @@
+package com.xsnb.system.service;public interface WechatService {
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/WechatServiceImpl.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/WechatServiceImpl.java
new file mode 100644
index 0000000..b7ff6ec
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/WechatServiceImpl.java
@@ -0,0 +1,6 @@
+package com.xsnb.system.service.impl;
+
+import com.xsnb.system.service.WechatService;
+
+public class WechatServiceImpl implements WechatService {
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/GzhUtiles.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/GzhUtiles.java
new file mode 100644
index 0000000..12d4e03
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/GzhUtiles.java
@@ -0,0 +1,209 @@
+package com.xsnb.auth;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xsnb.common.domain.XmlData;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class GzhUtiles {
+
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+ private final Environment env;
+
+ private static String AppSecret;
+ private static String appid;
+ private static String TOKEN;
+
+ @Autowired
+ public GzhUtiles(Environment env) {
+ this.env = env;
+
+ AppSecret = env.getProperty("wx.AppSecret");
+ appid = env.getProperty("wx.appid");
+ TOKEN = env.getProperty("wx.gzhTooken");
+
+ }
+
+
+ /**
+ * 公众号验证token--验证签名
+ *
+ * @param signature
+ * @param timestamp
+ * @param nonce
+ * @return
+ */
+ public boolean checkQianMing(String signature, String timestamp, String nonce) {
+
+
+ String[] tmpArr = {TOKEN, timestamp, nonce};
+ Arrays.sort(tmpArr);
+
+ StringBuilder tmpStrBuilder = new StringBuilder();
+ for (String str : tmpArr) {
+ tmpStrBuilder.append(str);
+ }
+
+ String tmpStr = tmpStrBuilder.toString();
+
+ try {
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ byte[] digest = md.digest(tmpStr.getBytes());
+
+ StringBuilder hexStrBuilder = new StringBuilder();
+ for (byte b : digest) {
+ hexStrBuilder.append(String.format("%02x", b));
+ }
+
+ String calculatedSignature = hexStrBuilder.toString();
+
+ return calculatedSignature.equals(signature);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ /**
+ * 获取微信公众号的AccessToken
+ *
+ * @return
+ */
+ public String getToken() {
+
+
+ // 判断数据是否存在
+ Boolean gzhAccessToken = redisTemplate.hasKey("gzh_access_token");
+
+
+ //存入缓存 存在两小时
+ //三秒
+ if (!gzhAccessToken) {
+ // 授予形式
+ System.out.println("第一次进入");
+ String grant_type = "client_credential";
+ // 接口地址拼接参数(appid为微信服务号的appid,secret为服务号的秘钥)
+ String getTokenApi = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + appid
+ + "&secret=" + AppSecret;
+ String tokenJsonStr = doGetPost(getTokenApi, "GET", null);
+ JSONObject tokenJson = JSONObject.parseObject(tokenJsonStr);
+ String token = tokenJson.get("access_token").toString();
+ // 存入缓存 120分钟 重新获取
+
+ // 存储数据并设置过期时间为 120 分钟
+ redisTemplate.opsForValue().set("gzh_access_token", token, 2, TimeUnit.HOURS);
+ return token;
+ } else {
+ // 获取数据
+ return redisTemplate.opsForValue().get("gzh_access_token");
+ }
+ }
+
+
+ /**
+ * 调用接口 post
+ *
+ * @param apiPath
+ */
+ public static String doGetPost(String apiPath, String type, Map paramMap) {
+ OutputStreamWriter out = null;
+ InputStream is = null;
+ String result = null;
+
+ try {
+ URL url = new URL(apiPath);// 创建连接
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.setUseCaches(false);
+ connection.setInstanceFollowRedirects(true);
+ connection.setRequestMethod(type); // 设置请求方式
+ connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
+ connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
+ connection.connect();
+ if (type.equals("POST")) {
+ out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
+ out.append(JSON.toJSONString(paramMap));
+ out.flush();
+ out.close();
+ }
+ // 读取响应
+ is = connection.getInputStream();
+ int length = (int) connection.getContentLength();// 获取长度
+ if (length != -1) {
+ byte[] data = new byte[length];
+ byte[] temp = new byte[512];
+ int readLen = 0;
+ int destPos = 0;
+ while ((readLen = is.read(temp)) > 0) {
+ System.arraycopy(temp, 0, data, destPos, readLen);
+ destPos += readLen;
+ }
+ result = new String(data, "UTF-8"); // utf-8编码
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return result;
+ }
+
+
+ /**
+ * 解析公众号用户触发响应的xml
+ *
+ * @param requestBody
+ * @return
+ */
+ public static XmlData jxXml(String requestBody) {
+
+ String unescapedXml = StringEscapeUtils.unescapeHtml4(requestBody);
+ try {
+ // 为XmlData类创建JAXB上下文
+ JAXBContext jaxbContext = JAXBContext.newInstance(XmlData.class);
+
+ // 创建反序列化器
+ Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
+ // 从XML反序列化为Java对象
+ XmlData xmlData = (XmlData) unmarshaller.unmarshal(new StringReader(unescapedXml));
+
+ System.out.println(xmlData.toString());
+
+ return xmlData;
+ } catch (JAXBException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/HttpUtil.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/HttpUtil.java
new file mode 100644
index 0000000..1a76376
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/HttpUtil.java
@@ -0,0 +1,167 @@
+package com.xsnb.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.google.gson.Gson;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class HttpUtil {
+
+
+
+
+ private static final Gson gson = new Gson();
+
+
+ /**
+ * get方法
+ *
+ * @param url
+ * @return
+ */
+
+ public static Map doGet(String url) {
+ Map map = new HashMap<>();
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+
+ RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) //连接超时
+ .setConnectionRequestTimeout(5000)//请求超时
+ .setSocketTimeout(5000)
+ .setRedirectsEnabled(true) //允许自动重定向
+ .build();
+ HttpGet httpGet = new HttpGet(url);
+ httpGet.setConfig(requestConfig);
+
+ try {
+ HttpResponse httpResponse = httpClient.execute(httpGet);
+ if (httpResponse.getStatusLine().getStatusCode() == 200) {
+
+ String jsonResult = EntityUtils.toString(httpResponse.getEntity());
+ map = gson.fromJson(jsonResult, map.getClass());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ httpClient.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return map;
+ }
+
+
+ /**
+ * 封装post
+ *
+ * @return
+ */
+ public static Map doPost(String url, String data, int timeout) {
+ Map map = new HashMap<>();
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ //超时设置
+ RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout) //连接超时
+ .setConnectionRequestTimeout(timeout)//请求超时
+ .setSocketTimeout(timeout)
+ .setRedirectsEnabled(true) //允许自动重定向
+ .build();
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.setConfig(requestConfig);
+ httpPost.addHeader("Content-Type", "text/html; chartset=UTF-8");
+
+ if (data != null && data instanceof String) { //使用字符串传参
+ StringEntity stringEntity = new StringEntity(data, "UTF-8");
+ httpPost.setEntity(stringEntity);
+ }
+
+ try {
+ CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
+ HttpEntity httpEntity = httpResponse.getEntity();
+ if (httpResponse.getStatusLine().getStatusCode() == 200) {
+ String result = EntityUtils.toString(httpEntity);
+ map = gson.fromJson(result, map.getClass());
+ return map;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ httpClient.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 调用接口 post
+ *
+ * @param apiPath
+ */
+ public static String doGetPost(String apiPath, String type, Map paramMap) {
+ OutputStreamWriter out = null;
+ InputStream is = null;
+ String result = null;
+ try {
+ URL url = new URL(apiPath);// 创建连接
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.setUseCaches(false);
+ connection.setInstanceFollowRedirects(true);
+ connection.setRequestMethod(type); // 设置请求方式
+ connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
+ connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
+ connection.connect();
+ if (type.equals("POST")) {
+ out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
+ out.append(JSON.toJSONString(paramMap));
+ out.flush();
+ out.close();
+ }
+ // 读取响应
+ is = connection.getInputStream();
+ int length = (int) connection.getContentLength();// 获取长度
+ if (length != -1) {
+ byte[] data = new byte[length];
+ byte[] temp = new byte[512];
+ int readLen = 0;
+ int destPos = 0;
+ while ((readLen = is.read(temp)) > 0) {
+ System.arraycopy(temp, 0, data, destPos, readLen);
+ destPos += readLen;
+ }
+ result = new String(data, "UTF-8"); // utf-8编码
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return result;
+ }
+}
diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/minio/MinioUtil.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/minio/MinioUtil.java
new file mode 100644
index 0000000..37219b4
--- /dev/null
+++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/utils/minio/MinioUtil.java
@@ -0,0 +1,220 @@
+package com.xsnb.common.utils.minio;
+
+import com.alibaba.nacos.common.utils.UuidUtils;
+import com.xsnb.common.config.MinioConfig;
+import com.xsnb.common.utils.StringUtils;
+import io.minio.*;
+import io.minio.http.Method;
+import io.minio.messages.Bucket;
+import io.minio.messages.Item;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+import org.springframework.util.FastByteArrayOutputStream;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+@Slf4j
+@Configuration
+public class MinioUtil {
+ @Autowired
+ private MinioConfig prop;
+
+ @Resource
+ private MinioClient minioClient;
+
+
+ /**
+ * 查看存储bucket是否存在
+ * @return boolean
+ */
+ public Boolean bucketExists(String bucketName) {
+ Boolean found;
+ try {
+ found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ return found;
+ }
+
+ /**
+ * 创建存储bucket
+ * @return Boolean
+ */
+ public Boolean makeBucket(String bucketName) {
+ try {
+ minioClient.makeBucket(MakeBucketArgs.builder()
+ .bucket(bucketName)
+ .build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+ /**
+ * 删除存储bucket
+ * @return Boolean
+ */
+ public Boolean removeBucket(String bucketName) {
+ try {
+ minioClient.removeBucket(RemoveBucketArgs.builder()
+ .bucket(bucketName)
+ .build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+ /**
+ * 获取全部bucket
+ */
+ public List getAllBuckets() {
+ try {
+ List buckets = minioClient.listBuckets();
+ return buckets;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+ /**
+ * 文件上传
+ *
+ * @param file 文件
+ * @return Boolean
+ */
+ public String upload(MultipartFile file) {
+ String originalFilename = file.getOriginalFilename();
+ if (StringUtils.isBlank(originalFilename)){
+ throw new RuntimeException();
+ }
+ String fileName = UuidUtils.generateUuid() + originalFilename.substring(originalFilename.lastIndexOf("."));
+ String objectName = getNowDateLongStr("yyyy-MM/dd") + "/" + fileName;
+ try {
+ PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(objectName)
+ .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
+ //文件名称相同会覆盖
+ minioClient.putObject(objectArgs);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return objectName;
+ }
+
+ /**
+ * 预览图片
+ * @param fileName
+ * @return
+ */
+ public String preview(String fileName){
+ // 查看文件地址
+ GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs()
+ .builder()
+ .bucket(prop.getBucketName())
+ .object(fileName)
+ .method(Method.GET).build();
+ try {
+ String url = minioClient.getPresignedObjectUrl(build);
+ return url;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 文件下载
+ * @param fileName 文件名称
+ * @param res response
+ * @return Boolean
+ */
+ public void download(String fileName, HttpServletResponse res) {
+ GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(prop.getBucketName())
+ .object(fileName).build();
+ try (GetObjectResponse response = minioClient.getObject(objectArgs)){
+ byte[] buf = new byte[1024];
+ int len;
+ try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
+ while ((len=response.read(buf))!=-1){
+ os.write(buf,0,len);
+ }
+ os.flush();
+ byte[] bytes = os.toByteArray();
+ res.setCharacterEncoding("utf-8");
+ // 设置强制下载不打开
+ // res.setContentType("application/force-download");
+ res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
+ try (ServletOutputStream stream = res.getOutputStream()){
+ stream.write(bytes);
+ stream.flush();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 查看文件对象
+ * @return 存储bucket内文件对象信息
+ */
+ public List- listObjects() {
+ Iterable> results = minioClient.listObjects(
+ ListObjectsArgs.builder().bucket(prop.getBucketName()).build());
+ List
- items = new ArrayList<>();
+ try {
+ for (Result
- result : results) {
+ items.add(result.get());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return items;
+ }
+
+ /**
+ * 删除
+ * @param fileName
+ * @return
+ * @throws Exception
+ */
+ public boolean remove(String fileName){
+ try {
+ minioClient.removeObject( RemoveObjectArgs.builder().bucket(prop.getBucketName()).object(fileName).build());
+ }catch (Exception e){
+ return false;
+ }
+ return true;
+ }
+
+
+ //获取现在时间
+ public String getNowDateLongStr(String format) {
+ // 获取当前日期
+ LocalDate currentDate = LocalDate.now();
+ // 根据指定格式进行日期格式化
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
+ String formattedDate = currentDate.format(formatter);
+ return formattedDate;
+ }
+
+}
+