Compare commits

...

2 Commits

Author SHA1 Message Date
张海宁 692ec928f3 邮箱添加 2024-04-07 17:34:49 +08:00
张海宁 95b2c04a9d Remove .idea folder 2024-04-07 17:33:40 +08:00
48 changed files with 1788 additions and 157 deletions

8
.idea/.gitignore vendored
View File

@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="xsnb-gateway" />
<module name="xsnb-system" />
<module name="xsnb-common" />
<module name="xsnb-auth" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel target="17">
<module name="zhn-auth" target="1.8" />
<module name="zhn-dev" target="1.8" />
<module name="zhn-gateway" target="1.8" />
<module name="zhn-modules" target="1.8" />
<module name="zhn-system" target="1.8" />
</bytecodeTargetLevel>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="xsnb-auth" options="-parameters" />
<module name="xsnb-common" options="-parameters" />
<module name="xsnb-gateway" options="-parameters" />
<module name="xsnb-system" options="-parameters" />
<module name="zhn-auth" options="-parameters" />
<module name="zhn-gateway" options="-parameters" />
<module name="zhn-system" options="-parameters" />
</option>
</component>
</project>

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-auth/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-common/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-gateway/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-modules/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-modules/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/xsnb-modules/xsnb-system/src/main/java" charset="UTF-8" />
</component>
</project>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://maven.aliyun.com/nexus/content/repositories/central/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CodeInsightWorkspaceSettings">
<option name="optimizeImportsOnTheFly" value="true" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/xsnb-modules/zhn-system/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK" />
</project>

View File

@ -13,6 +13,7 @@
<module>xsnb-gateway</module>
<module>xsnb-auth</module>
<module>xsnb-modules</module>
<module>xsnb-invoiceManager</module>
</modules>
<!-- 规定SpringBoot版本 -->

View File

@ -8,7 +8,6 @@ import com.xsnb.common.domain.response.RespJwt;
import com.xsnb.common.result.Result;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@ -20,16 +19,11 @@ import javax.servlet.http.HttpServletRequest;
public class AuthController {
@Autowired
AuthService authService;
@PostMapping("/getPhoneCode")
public Result getPhoneCode(@RequestBody User user ){
log.info("获取的信息:{}",user.toString());
return authService.getPhoneCode(user);
}
/**
*
*
@ -37,16 +31,14 @@ public class AuthController {
* @return
*/
@PostMapping("/login")
Result<RespJwt> login(@RequestBody RequestUser requestUser){
public Result<RespJwt> login(@RequestBody RequestUser requestUser){
return authService.login(requestUser);
}
@GetMapping("/user/info")
Result<User> userinfo(HttpServletRequest request){
@PostMapping("/user/info")
public Result<User> userinfo(HttpServletRequest request){
return authService.userinfo(request);
}

View File

@ -29,3 +29,4 @@ spring:
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

View File

@ -114,6 +114,22 @@
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-open</artifactId>
<version>3.8.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,19 @@
package com.xsnb.common;
public enum EventType {
// 订阅事件
SUBSCRIBE("subscribe"),
// 已关注事件
Login("SCAN"),
// 取消订阅事件
UNSUBSCRIBE("unsubscribe");
private final String value;
EventType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}

View File

@ -1,11 +1,13 @@
package com.xsnb.common.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user")
public class User {
private Integer id;
@ -18,5 +20,6 @@ public class User {
private String avatar;
private Date lastLoginTime;
private String balance;
private String OpenId;
}

View File

@ -0,0 +1,40 @@
package com.xsnb.common.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlData {
@XmlElement(name = "ToUserName", required = false)
private String toUserName;
@XmlElement(name = "FromUserName", required = false)
private String fromUserName;
@XmlElement(name = "CreateTime", required = false)
private long createTime;
@XmlElement(name = "MsgType", required = false)
private String msgType;
@XmlElement(name = "Event", required = false)
private String event;
@XmlElement(name = "EventKey", required = false)
private String eventKey;
@XmlElement(name = "Ticket", required = false)
private String ticket;
}

View File

@ -0,0 +1,11 @@
package com.xsnb.common.exception;
import com.thoughtworks.xstream.core.BaseException;
public class WechatException extends BaseException {
private static final long serialVersionUID = 1L;
public WechatException(String code, Object[] args) {
super("wechat");
}
}

View File

@ -0,0 +1,7 @@
package com.xsnb.common.exception;
public class WechatQrCodeException extends WechatException{
public WechatQrCodeException() {
super("wechat.qrCode.generate.error", null);
}
}

View File

@ -0,0 +1,44 @@
package com.xsnb.common.utils;
import com.xsnb.common.utils.Msg.HttpUtils;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class GyTelSmsUtils {
//构造函数
public static String sendPhone(String phone, String code) {
String host = "https://gyytz2.market.alicloudapi.com";
String path = "/sms/smsSendLong";
String method = "POST";
String appcode = "你自己的AppCode";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + appcode);
Map<String, String> querys = new HashMap<String, String>();
querys.put("mobile", phone);
querys.put("templateId", "908e94ccf08b4476ba6c876d13f084ad");
querys.put("smsSignId", "2e65b1bb3d054466b82f0c9d125465e2");
querys.put("param", "**code**:"+code+",**minute**:5");
Map<String, String> bodys = new HashMap<String, String>();
try {
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
//获取response的body
System.out.println(EntityUtils.toString(response.getEntity()));
return response.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -43,6 +43,7 @@
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>

View File

@ -29,4 +29,5 @@ public class IgnoreWhiteConfig {
log.info("加载网关路径白名单:{}", JSONObject.toJSONString(whites));
this.whites = whites;
}
}

View File

@ -70,4 +70,5 @@ public class AuthFilters implements GlobalFilter, Ordered {
public int getOrder() {
return 0;
}
}

View File

@ -15,6 +15,15 @@ spring:
# 允许定义相同的bean对象 去覆盖原有的
allow-bean-definition-overriding: true
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOriginPatterns: "*"
allowedMethods: "*"
allowedHeaders: "*"
allowCredentials: true
add-to-simple-url-handler-mapping: true
nacos:
discovery:
# 服务注册地址

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xsnb</groupId>
<artifactId>xsnb-dev</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>xsnb-invoiceManager</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 系统公共 依赖 -->
<dependency>
<groupId>com.xsnb</groupId>
<artifactId>xsnb-common</artifactId>
</dependency>
<!-- SpringBoot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Mybatis 依赖配置 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- Pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<!-- commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
<scope>system</scope>
<systemPath>C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\commons-codec-1.12.jar</systemPath>
</dependency>
<!-- commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<scope>system</scope>
<systemPath>C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\commons-logging-1.2.jar</systemPath>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
<scope>system</scope>
<systemPath>C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\httpclient-4.5.5.jar</systemPath>
</dependency>
<!-- httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
<scope>system</scope>
<systemPath>C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\httpcore-4.4.9.jar</systemPath>
</dependency>
<!-- open-sdk -->
<dependency>
<groupId>your-group-id-for-open-sdk</groupId>
<artifactId>open-sdk</artifactId>
<version>1.0.5.2</version>
<scope>system</scope>
<systemPath>C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\open-sdk-1.0.5.2.jar</systemPath>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,13 @@
package com.xsnb.invoiceManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class InvoiceManagerMain {
public static void main(String[] args) {
SpringApplication.run(InvoiceManagerMain.class, args);
}
}

View File

@ -0,0 +1,37 @@
package com.xsnb.invoiceManager.config;
import nuonuo.open.sdk.NNOpenSDK;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class NonoReq {
public String initial() {
NNOpenSDK sdk = NNOpenSDK.getIntance();
String taxnum = "91330206MA7EAY4722"; // 授权企业税号
String appKey = "41385340";
String appSecret = "FC62F00FEC5A4803 ";
String method = "nuonuo.OpeMplatform.queryInvoiceList"; // API方法名
String token = "8ace30e5d4c5b0ebd452c30lfzjval9s"; // 访问令牌
String content = "{\"requestType\": \"1\",\"pageNo\": \"2\",\"pageSize\": \"20\",\"taxnum\": \"91330206MA7EAY4722\",\"startTime\": \"2019-03-04 00:00:00\",\"endTime\": \"2024-03-09 00:00:00\"}";
String url = "https://sdk.nuonuo.com/open/v1/services"; // SDK请求地址
String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识32位随机码无需修改保持默认即可
System.out.println("编码: "+senid);
String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
System.out.println(result);
return result;
}
public String getToken(){
String json = NNOpenSDK.getIntance().getMerchantToken("41385340","FC62F00FEC5A4803");
return json;
}
}

View File

@ -0,0 +1,32 @@
package com.xsnb.invoiceManager.controller;
import com.xsnb.invoiceManager.config.NonoReq;
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.RestController;
@RestController
@RequestMapping("/saas")
public class IMController {
@Autowired
NonoReq nonoReq;
@GetMapping("/queryInvoiceList")
public String index() {
String initial = nonoReq.initial();
return initial;
}
@GetMapping("/getToken")
public String getToken() {
String token = nonoReq.getToken();
return token;
}
}

View File

@ -0,0 +1,164 @@
package com.xsnb.invoiceManager.domain;
public class InvoiceConstants {
/**
*
*/
public static final String TAX_NUM = "**********";
/**
*
* appKey
*/
public static final String APP_KEY = "**********";
/**
*
*
*/
public static final String APP_SECRET = "**********";
/**
*
* appKey
*/
public static final String TEST_APP_KEY = "**********";
/**
*
*/
public static final String TEST_APP_SECRET = "**********";
/**
* API
*/
public static final String APPLY_METHOD = "nuonuo.electronInvoice.requestBilling";
/**
*
*
*/
public static final String URL = "https://sdk.nuonuo.com/open/v1/services";
/**
*
*/
public static final String TEST_URL = "https://sandbox.nuonuocs.cn/open/v1/services";
/**
* API
*/
public static final String CHECK_METHOD = "nuonuo.electronInvoice.CheckEInvoice";
/**
*
*/
public static final String QUERY_METHOD = "nuonuo.electronInvoice.querySerialNum";
/**
*
*/
public static final String SALER_ACCOUNT = "";
/**
*
*
*/
public static final String TEST_SALER_ACCOUNT = "杭州银行彭埠支行120200590990432278";
/**
*
*/
public static final String SALER_ADDRESS = "";
/**
*
*
*/
public static final String TEST_SALER_ADDRESS = "杭州市西湖区万塘路30号高新东方科技园";
/**
*
*/
public static final String SALER_TEL = "";
/**
*
*
*/
public static final String TEST_SALER_TEL = "0571-81029365";
/**
*
*
*/
public static final String TEST_SALER_TAX_NUM = "339901999999142";
/**
*
*/
public static final String TAX_RATE = "0.13";
/**
* :0,;1,;2,
*/
public static final String INVOICE_LINE_PROPERTY = "0";
/**
*
* specType
*/
public static final String SPEC_TYPE = "";
/**
* N
*
* taxExcludedAmount
*/
public static final String TAX_EXCLUDED_AMOUNT = "";
/**
* :0,使;1,使
*/
public static final String FAVOURED_POLICY_FLAG = "0";
/**
* ,favouredPolicyFlag1 N
*/
public static final String FAVOURED_POLICY_NAME = "";
/**
* 0:,1:
*/
public static final String WITH_TAX_FLAG = "1";
/**
* [] * [] = [] 0.06
*
*/
public static final String TAX = "";
/**
*
*/
public static final String UNIT = "***";
/**
*
*/
public static final String DEDUCTION = "0";
/**
* :,;1,;2,;3,
*/
public static final String ZERO_RATE_FLAG = "";
/**
* :1,;2,
*/
public static final String INVOICE_TYPE = "1";
/**
* :p,()();c,();s,;e,();f,() N
*/
public static final String INVOICE_LINE = "p";
/**
* :0,;1, N
*/
public static final String LIST_FLAG = "0";
/**
* :-1,;0,;1,;2, N
*/
public static final String PUSH_MODE = "2";
/**
* :0,();1, N
*/
public static final String PRODUCT_OIL_FLAG = "0";
/**
* :0;1 N
* :***,:***
* :***:***:***:***
*/
public static final String PROXY_INVOICE_FLAG = "0";
/**
*
*/
public static final String APPLY_SUCCESS_CODE = "E0000";
/**
*
*/
public static final String SUCCESS_CODE = "2";
}

View File

@ -0,0 +1,23 @@
server:
port: 9003
spring:
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-invoiceManager
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}"

View File

@ -77,18 +77,19 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>com.xsnb</groupId>
<artifactId>xsnb-auth</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,31 @@
package com.xsnb.system.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;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
@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();
}
/**
*
*/
}

View File

@ -0,0 +1,28 @@
package com.xsnb.system.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;
}
}

View File

@ -0,0 +1,88 @@
package com.xsnb.system.controller;
import com.xsnb.common.result.Result;
import com.xsnb.system.config.MinioConfig;
import com.xsnb.system.utils.minio.MinioUtil;
import io.minio.messages.Bucket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Slf4j
@RestController
@RequestMapping(value = "product/file")
public class FileController {
@Autowired
private MinioUtil minioUtil;
@Autowired
private MinioConfig prop;
//@ApiOperation(value = "查看存储bucket是否存在")
@GetMapping("/bucketExists")
public Result bucketExists(@RequestParam("bucketName") String bucketName) {
return Result.success(minioUtil.bucketExists(bucketName));
}
//@ApiOperation(value = "创建存储bucket")
@GetMapping("/makeBucket")
public Result makeBucket(String bucketName) {
return Result.success(minioUtil.makeBucket(bucketName));
}
//@ApiOperation(value = "删除存储bucket")
@GetMapping("/removeBucket")
public Result removeBucket(String bucketName) {
return Result.success(minioUtil.removeBucket(bucketName));
}
//@ApiOperation(value = "获取全部bucket")
@GetMapping("/getAllBuckets")
public Result getAllBuckets() {
List<Bucket> allBuckets = minioUtil.getAllBuckets();
return Result.success(allBuckets);
}
//@ApiOperation(value = "文件上传返回url")
@CrossOrigin(origins = "http://192.168.2.143:8080") // 允许来自http://localhost:8080的跨域请求
@PostMapping("/upload")
public Result upload(@RequestParam("file") MultipartFile file) {
String objectName = minioUtil.upload(file);
if (null != objectName) {
return Result.success((prop.getEndpoint() + "/" + prop.getBucketName() + "/" + objectName), "url");
}
return Result.success("请求失败");
}
//@ApiOperation(value = "图片/视频预览")
@GetMapping("/preview")
public Result preview(@RequestParam("fileName") String fileName) {
String preview = minioUtil.preview(fileName);
return Result.success(preview);
}
//@ApiOperation(value = "文件下载")
@GetMapping("/download")
public Result download(@RequestParam("fileName") String fileName, HttpServletResponse res) {
minioUtil.download(fileName, res);
return Result.success("下载成功");
}
//@ApiOperation(value = "删除文件", notes = "根据url地址删除文件")
@PostMapping("/delete")
public Result remove(String url) {
String objName = url.substring(url.lastIndexOf(prop.getBucketName() + "/") + prop.getBucketName().length() + 1);
minioUtil.remove(objName);
return Result.success("删除成功" + objName);
}
}

View File

@ -5,10 +5,8 @@ import com.xsnb.common.result.Result;
import com.xsnb.system.domain.Mail;
import com.xsnb.system.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@ -24,28 +22,41 @@ import java.util.List;
@RestController
@RequestMapping("/mail")
public class DomeController {
public class MailController {
@Autowired
MailService mailService;
//获取邮件列表
@PostMapping("/allListMail")
public Result<List<Mail>> allListMail(User user){
return mailService.allListMail(user);
}
public Result<List<Mail>> allListMail(@RequestBody User user){return mailService.allListMail(user);}
//删除邮件,通过传来的邮箱id来删除邮件
@PostMapping("/deleteMail")
public Result<Mail> deleteMail(Mail mail){
return mailService.deleteMail(mail);
@PostMapping("/deleteMail/{mailId}")
public Result deleteMail(@PathVariable Long[] mailId){
return mailService.deleteMail(mailId);
}
//添加邮件,通过邮箱实体类来创建邮箱,也就是邮箱发送
@PostMapping("/addMail")
public Result<Mail> addMail(@RequestBody Mail mail){
return mailService.addMail(mail);
}
//邮箱已读未读状态
@PostMapping("/reading")
public Result reading(Mail mail){
return mailService.reading(mail);
}
//附件添加
@PostMapping("/addAttachment")
public Result addAttachment( Mail mail,@RequestParam("file") MultipartFile file){
return mailService.addAttachment(mail,file);
}
//抄送
@PostMapping("/copyMail")
public Result copyMail(Mail mail){
return mailService.copyMail(mail);
}
}

View File

@ -34,4 +34,6 @@ public class UserController {
}

View File

@ -0,0 +1,83 @@
package com.xsnb.system.controller;
import com.xsnb.common.domain.response.RespJwt;
import com.xsnb.common.result.Result;
import com.xsnb.system.service.WechatService;
import com.xsnb.system.utils.GzhUtiles;
import com.xsnb.system.utils.HttpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestController
@RequestMapping("/weChat")
public class WechatController {
@Autowired
GzhUtiles gzhUtiles;
@Resource
private WechatService wechatService;
private HttpUtil httpUtil;
@Autowired
public WechatController(HttpUtil httpUtil) {
this.httpUtil = httpUtil;
}
/**
*
*
* @return
*/
@GetMapping("/getLoginQrCode")
@ResponseBody
public Result getLoginQrCode() {
return Result.success(wechatService.getQRCode(), "获取成功");
}
/**
* 使ws
*
* @param ticket uuid
* @return
*/
@GetMapping("/checkLogin")
public Result<RespJwt> checkLogin(String ticket) {
RespJwt respJwt = wechatService.checkLogin(ticket);
return Result.success(respJwt);
}
//微信返回不同请求-post请求
@PostMapping(value = "/weCat.do", produces = {"application/json;charset=UTF-8"})
public void validationWeCat(@RequestBody String requestBody,
HttpServletResponse response)
throws IOException {
wechatService.validationWeCat(requestBody);
response.getOutputStream().println("success");
}
//微信返回不同请求-get请求
@GetMapping(value = "/weCat.do", produces = {"application/json;charset=UTF-8"})
public void validationWeCat(@RequestParam String signature,
@RequestParam String timestamp,
@RequestParam String nonce,
@RequestParam String echostr,
HttpServletResponse response) throws IOException {
final boolean b = gzhUtiles.checkQianMing(signature, timestamp, nonce);
if (b) {
response.getOutputStream().println(echostr);
} else {
System.out.println("token验证失败");
}
}
}

View File

@ -1,6 +1,7 @@
package com.xsnb.system.domain;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* FileName: Attachment
@ -12,10 +13,17 @@ import lombok.Data;
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@TableName("attachment_list")
@Builder
public class Attachment {
/** 文件名称 */
public String fileName;
/** 文件路径 */
public String filePath;
private String id;
private String emailId;
private String upUserId;
private String filePath;
private String fileName;
}

View File

@ -2,10 +2,7 @@ package com.xsnb.system.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.*;
import java.util.Date;
@ -14,6 +11,7 @@ import java.util.Date;
@NoArgsConstructor
@ToString
@TableName("email")
@Builder
public class Mail {
private int id;

View File

@ -0,0 +1,22 @@
package com.xsnb.system.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@TableName("wx_user_log")
@Builder
public class WxUserLog {
private String id;
private String createTime;
private String event;
private String eventKey;
private String fromUserName;
private String msgType;
private String ticket;
private String toUserName;
}

View File

@ -0,0 +1,10 @@
package com.xsnb.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xsnb.system.domain.Attachment;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AttachmentMapper extends BaseMapper<Attachment> {
}

View File

@ -2,6 +2,13 @@ package com.xsnb.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xsnb.system.domain.Mail;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface MailMapper extends BaseMapper<Mail> {
int deleteBatchIds(@Param("ids") List<Integer> ids);
}

View File

@ -0,0 +1,9 @@
package com.xsnb.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xsnb.system.domain.WxUserLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WxUserLogMapper extends BaseMapper<WxUserLog> {
}

View File

@ -24,6 +24,9 @@ public class MessageConsumerService {
private RedisTemplate<String,String> redisTemplate;
@RabbitListener(queuesToDeclare = {@Queue(RabbitMQConstants.SEND_SMS_QUEUs)})
public void SmsController(String phone, Message message, Channel channel){
long s = System.currentTimeMillis();
@ -36,6 +39,7 @@ public class MessageConsumerService {
String jsons = TelSmsUtils.sendSms(phone, new HashMap<String, String>() {{
put("code",code);
}});
/* gyTelSmsUtils.sendPhone(phone,code);*/
redisTemplate.opsForValue().set(phone,code);
SendSmsResponseBody sendSmsResponseBody = JSONObject.parseObject(jsons, SendSmsResponseBody.class);
if(!"OK".equals(sendSmsResponseBody.getCode())){

View File

@ -3,6 +3,7 @@ package com.xsnb.system.service;
import com.xsnb.common.domain.User;
import com.xsnb.common.result.Result;
import com.xsnb.system.domain.Mail;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@ -19,7 +20,18 @@ public interface MailService {
Result<List<Mail>> allListMail(User user);
Result<Mail> deleteMail(Mail mail);
Result deleteMail(Long[] delId);
Result<Mail> addMail(Mail mail);
/**
*
* @param mail
* @return
*/
Result reading(Mail mail);
Result addAttachment(Mail mail, MultipartFile file);
Result copyMail(Mail mail);
}

View File

@ -0,0 +1,12 @@
package com.xsnb.system.service;
import com.xsnb.common.domain.response.RespJwt;
public interface WechatService {
Object getQRCode();
void validationWeCat(String requestBody);
RespJwt checkLogin(String ticket);
}

View File

@ -3,15 +3,24 @@ package com.xsnb.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xsnb.common.domain.User;
import com.xsnb.common.result.Result;
import com.xsnb.system.domain.Attachment;
import com.xsnb.system.domain.Mail;
import com.xsnb.system.mapper.AttachmentMapper;
import com.xsnb.system.mapper.MailMapper;
import com.xsnb.system.service.MailService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* FileName: MailServiceImpl
@ -27,8 +36,11 @@ import java.util.List;
public class MailServiceImpl implements MailService {
@Autowired
MailMapper mapper;
@Autowired
UserServiceImpl userService;
@Autowired
AttachmentMapper attachmentMapper;
/**
* @param user
@ -37,20 +49,23 @@ public class MailServiceImpl implements MailService {
@Override
public Result<List<Mail>> allListMail(User user) {
QueryWrapper<Mail> qw = new QueryWrapper<>();
qw.eq("user_id", user.getId());
List<Mail> mailList = mapper.selectList(qw);
log.info("查询邮件的结果:{}",mailList);
return Result.success(mailList);
Integer id = user.getId();
log.info("id的值是:{}", id);
qw.eq("recipient_id", id);
log.info("qw值是:{}", qw);
//通过接收者id来查询邮件
List<Mail> mail = mapper.selectList(qw);
return Result.success(mail);
}
/**
* @param mail
* @param delIds
* @return
*/
@Override
public Result<Mail> deleteMail(Mail mail) {
return null;
public Result deleteMail(Long[] delIds) {
System.out.println("获取的delIds是:"+delIds.toString());
return Result.success("批量删除成功,未删除的邮件为");
}
/**
@ -59,16 +74,78 @@ public class MailServiceImpl implements MailService {
*/
@Override
public Result<Mail> addMail(Mail mail) {
log.info("添加邮件的数据:{}",mail);
//获取当前时间转换为Date类型
mail.setSendTime(new Date());
mail.setEmailStatus("未读");
log.info("添加邮件的数据:{}", mail);
//获取当前用户信息
Mail.MailBuilder builder = Mail
.builder()
.title(mail.getTitle())
.sendTime(new Date())
.readTime(mail.getReadTime())
.content(mail.getContent())
.attachmentId(mail.getAttachmentId())
.emailStatus("0")
.userId(mail.getUserId())
.recipientId(mail.getRecipientId());
//存入数据库
int insert = mapper.insert(mail);
log.info("添加邮件的结果:{}",insert);
return insert==1?Result.success(mail,"发送成功"):Result.error("发送失败");
int insert = mapper.insert(builder.build());
log.info("添加邮件的结果:{}", builder);
return insert == 1 ? Result.success(mail, "发送成功") : Result.error("发送失败");
}
/**
*
*
* @param mail
* @return
*/
@Override
public Result reading(Mail mail) {
Mail mail1 = mail;
mail1.setEmailStatus("1");
int i = mapper.updateById(mail1);
return i == 1 ? Result.success(mail, "修改成功") : Result.error("修改失败");
}
/**
* @param mail
* @return
*/
@Override
public Result addAttachment(Mail mail, MultipartFile file) {
// 如果邮件对象或文件对象为空,返回错误结果
if (mail == null || file == null || file.isEmpty()) {
return Result.error("邮件对象或文件为空");
}
try {
// 生成唯一的文件名
String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
// 构建文件保存路径
Path filePath = Paths.get("D://file" + File.separator + fileName);
// 将文件保存到本地文件系统
Files.copy(file.getInputStream(), filePath);
int id = mail.getId();
Attachment build = new Attachment().builder().emailId(String.valueOf(id)).fileName(fileName).filePath(filePath.toString()).upUserId(String.valueOf(mail.getUserId())).build();
int insert = attachmentMapper.insert(build);
// 返回成功结果
return Result.success("文件上传成功", filePath.toString());
} catch (IOException e) {
e.printStackTrace();
// 文件上传失败,返回错误结果
return Result.error("文件上传失败");
}
}
/**
* @param mail
* @return
*/
@Override
public Result copyMail(Mail mail) {
return null;
}
}

View File

@ -6,16 +6,22 @@ import com.xsnb.common.domain.User;
import com.xsnb.common.result.Result;
import com.xsnb.system.mapper.UserMapper;
import com.xsnb.system.service.UserService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Log4j2
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
RedisTemplate redisTemplate;
@Override
public Result<User> byphone(String phone) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
@ -35,4 +41,21 @@ public class UserServiceImpl implements UserService {
}
/* public User getUser() {
*//* HttpServletRequest request=null;
String token = request.getHeader(TokenConstants.TOKEN);
String userKey = JwtUtils.getUserKey(token);
String s= (String) redisTemplate.opsForValue().get(TokenConstants.LOGIN_TOKEN_KEY + userKey);
User user = JSONObject.parseObject(s, User.class);
*//**//*获取用户信息*//**//*
log.info("userInfo获取的用户信息是:{}", user);*//*
return user;
}*/
}

View File

@ -0,0 +1,190 @@
package com.xsnb.system.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xsnb.common.EventType;
import com.xsnb.common.constants.JwtConstants;
import com.xsnb.common.constants.TokenConstants;
import com.xsnb.common.domain.User;
import com.xsnb.common.domain.XmlData;
import com.xsnb.common.domain.response.RespJwt;
import com.xsnb.common.exception.WechatQrCodeException;
import com.xsnb.common.utils.JwtUtils;
import com.xsnb.system.domain.WxUserLog;
import com.xsnb.system.mapper.UserMapper;
import com.xsnb.system.mapper.WxUserLogMapper;
import com.xsnb.system.service.WechatService;
import com.xsnb.system.utils.GzhUtiles;
import com.xsnb.system.utils.HttpUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
@Log4j2
public class WechatServiceImpl implements WechatService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private HttpUtil httpUtil;
@Autowired
private GzhUtiles gzhUtiles;
@Autowired
private UserMapper userMapper;
@Autowired
private WxUserLogMapper mapper;
/**
*
*
* @return /**
*
* @return ticket codeUrl Map
*/
@Override
public Map<String, String> 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<String, Object> 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<String, String> wxMap = new HashMap<>();
wxMap.put("uuid", ticket);
wxMap.put("codeUrl", codeUrl);
return wxMap;
}
} catch (Exception e) {
// 发生异常时抛出自定义异常
throw new WechatQrCodeException();
}
// 默认返回空 Map
return Collections.emptyMap();
}
@Override
public void validationWeCat(String requestBody) {
XmlData xmlData = GzhUtiles.jxXml(requestBody);
WxUserLog wxUserLog = new WxUserLog().builder()
.createTime(String.valueOf(xmlData.getCreateTime()))
.event(xmlData.getEvent())
.eventKey(xmlData.getEventKey())
.fromUserName(xmlData.getFromUserName())
.msgType(xmlData.getMsgType())
.ticket(xmlData.getTicket())
.toUserName(xmlData.getToUserName())
.build();
if (xmlData!=null){
int insert = mapper.insert(wxUserLog);
if (insert>0){
System.out.println("添加成功");
}
}
log.info("获取的xmlData:{}", JSONObject.toJSONString(xmlData));
Objects.requireNonNull(xmlData, "xml格式校验失败-null");
Objects.requireNonNull(xmlData.getEvent(), "xml格式校验失败-eventTypeNull");
Objects.requireNonNull(xmlData.getFromUserName(), "xml格式校验失败-eventTypeNull");
String eventType = xmlData.getEvent();
String openId = xmlData.getFromUserName();
String eventKey = xmlData.getEventKey();
//todo.1 在公众号点击关注不在进行用户的注册登录,仅仅在用户进行官网扫码时间进行用户的相关操作
//登录注册
//用户已关注扫描临时二维码或未关注扫描临时二维码进行关注
if ((EventType.Login.getValue().equals(eventType) && "login".equals(eventKey)) || (EventType.SUBSCRIBE.getValue().equals(eventType) && "qrscene_login".equals(eventKey))) {
String ticket = xmlData.getTicket();
login(ticket, openId);
}
}
public RespJwt login(String ticket, String openId) {
log.info("拿到的uuid是:{} ,wxOpenID是:{}........",ticket,openId);
redisTemplate.opsForValue().set(ticket + "state", String.valueOf(1));
//用openid查询用户信息
QueryWrapper<User> wrapper = new QueryWrapper<>();
QueryWrapper<User> id = wrapper.eq("open_id", openId);
User user = userMapper.selectOne(id);
if (user == null) {
//用户不存在,进行注册
log.info("用户不存在,进行注册");
//todo.2 暂时不进行注册,直接进行登录
}
user.setWx_uid(ticket);
int update = userMapper.update(user, id);
if (update == 0) {
log.info("用户不存在,进行注册");
}
HashMap<String, Object> map = new HashMap<>();
String userkey = UUID.randomUUID().toString().replaceAll("-", "");
map.put(JwtConstants.USER_KEY, userkey);
map.put(JwtConstants.DETAILS_USER_ID, user.getId());
// 生成token
String token = JwtUtils.createToken(map);
//存token
redisTemplate.opsForValue().set(
TokenConstants.LOGIN_TOKEN_KEY + userkey,
JSONObject.toJSONString(user),
TokenConstants.EXPIRATION,
TimeUnit.MINUTES
);
RespJwt respJwt = new RespJwt();
respJwt.setToken(token);
respJwt.setEidTime("720MIN");
return respJwt;
}
/**
* token
*
* @param ticket uuid
* @return Map
*/
public RespJwt checkLogin(String ticket) {
log.info("checkLogin+二维码的ticket传参:{}", ticket);
RespJwt respJwt = null;
Boolean ticketState = redisTemplate.hasKey(ticket + "state");//存在说明已经扫码
//通过uuid到user里拿openId
QueryWrapper<User> wrapper = new QueryWrapper<>();
QueryWrapper<User> id = wrapper.eq("wx_uid", ticket);
User user = userMapper.selectOne(id);
if (user == null) {
//用户不存在,进行注册
log.info("用户不存在,进行注册");
//todo.2 暂时不进行注册,直接进行登录
}
if (ticketState) {
String s = redisTemplate.opsForValue().get(ticket + "state");
if ("1".equals(s)) {
//进行登录
if (user != null) {
respJwt = login(ticket, user.getOpenId());
}else {
log.info("user为null,用户不存在,进行注册");
}
}
}
return respJwt;
}
}

View File

@ -0,0 +1,187 @@
package com.xsnb.system.utils;
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 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<String,String> 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.gzhToken");
}
/**
* 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为微信服务号的appidsecret为服务号的秘钥)
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<String, Object> 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 {
return (XmlData)JAXBContext
.newInstance(XmlData.class)
.createUnmarshaller()
.unmarshal(
new StringReader(unescapedXml)
);
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,167 @@
package com.xsnb.system.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<String, Object> doGet(String url) {
Map<String, Object> 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<String, Object> doPost(String url, String data, int timeout) {
Map<String, Object> 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<String, Object> 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;
}
}

View File

@ -0,0 +1,220 @@
package com.xsnb.system.utils.minio;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.xsnb.system.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<Bucket> getAllBuckets() {
try {
List<Bucket> 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<Item> listObjects() {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(prop.getBucketName()).build());
List<Item> items = new ArrayList<>();
try {
for (Result<Item> 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;
}
}

View File

@ -2,6 +2,10 @@ server:
port: 9002
spring:
servlet:
multipart:
max-file-size: 2048MB
max-request-size: 2048MB
mail: # 邮件相关配置
username: xingsnbadmin@xingsnb.cn # 你自己的QQ邮箱的用户名需要填写你的QQ邮箱地址
password: drjyrrmzqmjcbhdb # 你自己的QQ邮箱的密钥/密码需要填写你的QQ邮箱登录密码
@ -48,3 +52,15 @@ spring:
listener:
simple:
prefetch: 1
minio:
endpoint: http://192.168.2.140:9000 #Minio服务所在地址
bucketName: xsnb #存储桶名称
accessKey: minioadmin #访问的key
secretKey: minioadmin #访问的秘钥
wx:
# 公众号appid
appid: wxcc33718899709785
# 公众号AppSecret
AppSecret: 47e4626056e620a95395dd9d7f051d05
# 公众号tooken
gzhToken: gzhtoken