From 692ec928f3cdb2e45361136253196b599218d78a 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:34:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E7=AE=B1=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + .../xsnb/auth/controller/AuthController.java | 14 +- xsnb-auth/src/main/resources/bootstrap.yml | 1 + xsnb-common/pom.xml | 16 ++ .../main/java/com/xsnb/common/EventType.java | 20 +- .../java/com/xsnb/common/domain/User.java | 3 + .../java/com/xsnb/common/domain/XmlData.java | 40 +++- .../common/exception/WechatException.java | 11 +- .../exception/WechatQrCodeException.java | 7 +- .../com/xsnb/common/utils/GyTelSmsUtils.java | 44 ++++- xsnb-gateway/pom.xml | 1 + .../gateway/config/IgnoreWhiteConfig.java | 1 + .../com/xsnb/gateway/filters/AuthFilters.java | 1 + xsnb-gateway/src/main/resources/bootstrap.yml | 9 + xsnb-invoiceManager/pom.xml | 87 +++++++++ .../invoiceManager/InvoiceManagerMain.java | 13 +- .../xsnb/invoiceManager/config/NonoReq.java | 37 +++- .../controller/IMController.java | 32 ++- .../domain/InvoiceConstants.java | 164 +++++++++++++++- .../src/main/resources/bootstrap.yml | 31 +-- xsnb-modules/xsnb-system/pom.xml | 13 +- .../com/xsnb/system/config/MinioConfig.java | 7 +- .../xsnb/system/config/WeChatCodeConfig.java | 2 +- .../system/controller/FileController.java | 88 ++++++++- .../system/controller/MailController.java | 41 ++-- .../system/controller/UserController.java | 2 + .../system/controller/WechatController.java | 94 +++++---- .../com/xsnb/system/domain/Attachment.java | 18 +- .../java/com/xsnb/system/domain/Mail.java | 6 +- .../com/xsnb/system/domain/WxUserLog.java | 22 ++- .../xsnb/system/mapper/AttachmentMapper.java | 18 +- .../com/xsnb/system/mapper/MailMapper.java | 7 + .../xsnb/system/mapper/WxUserLogMapper.java | 9 +- .../rabbitMQ/MessageConsumerService.java | 4 + .../com/xsnb/system/service/MailService.java | 14 +- .../xsnb/system/service/WechatService.java | 12 +- .../system/service/impl/MailServiceImpl.java | 113 +++++++++-- .../system/service/impl/UserServiceImpl.java | 23 +++ .../service/impl/WechatServiceImpl.java | 184 ++++++++++++++++++ .../java/com/xsnb/system/utils/GzhUtiles.java | 38 +--- .../java/com/xsnb/system/utils/HttpUtil.java | 2 +- .../xsnb/system/utils/minio/MinioUtil.java | 4 +- .../src/main/resources/bootstrap.yml | 16 ++ 43 files changed, 1078 insertions(+), 192 deletions(-) diff --git a/pom.xml b/pom.xml index 0264de5..503dd9e 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ xsnb-gateway xsnb-auth xsnb-modules + xsnb-invoiceManager diff --git a/xsnb-auth/src/main/java/com/xsnb/auth/controller/AuthController.java b/xsnb-auth/src/main/java/com/xsnb/auth/controller/AuthController.java index 27935e2..4bceb7d 100644 --- a/xsnb-auth/src/main/java/com/xsnb/auth/controller/AuthController.java +++ b/xsnb-auth/src/main/java/com/xsnb/auth/controller/AuthController.java @@ -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 login(@RequestBody RequestUser requestUser){ - + public Result login(@RequestBody RequestUser requestUser){ return authService.login(requestUser); } - @GetMapping("/user/info") - Result userinfo(HttpServletRequest request){ + @PostMapping("/user/info") + public Result userinfo(HttpServletRequest request){ return authService.userinfo(request); - } diff --git a/xsnb-auth/src/main/resources/bootstrap.yml b/xsnb-auth/src/main/resources/bootstrap.yml index abe4521..d9a2e0d 100644 --- a/xsnb-auth/src/main/resources/bootstrap.yml +++ b/xsnb-auth/src/main/resources/bootstrap.yml @@ -29,3 +29,4 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + diff --git a/xsnb-common/pom.xml b/xsnb-common/pom.xml index eb362ae..e779703 100644 --- a/xsnb-common/pom.xml +++ b/xsnb-common/pom.xml @@ -114,6 +114,22 @@ mybatis-plus-boot-starter 3.3.1 + + + io.minio + minio + 8.4.0 + + + org.apache.tomcat.embed + tomcat-embed-core + + + + com.github.binarywang + weixin-java-open + 3.8.0 + diff --git a/xsnb-common/src/main/java/com/xsnb/common/EventType.java b/xsnb-common/src/main/java/com/xsnb/common/EventType.java index c152edd..c1f8143 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/EventType.java +++ b/xsnb-common/src/main/java/com/xsnb/common/EventType.java @@ -1,3 +1,19 @@ -package com.ruoyi.web.controller.gzh.domin; +package com.xsnb.common; -public enum EventType {} +public enum EventType { + // 订阅事件 + SUBSCRIBE("subscribe"), + // 已关注事件 + Login("SCAN"), + // 取消订阅事件 + UNSUBSCRIBE("unsubscribe"); + + private final String value; + + EventType(String value) { + this.value = value; + } + public String getValue() { + return value; + } +} diff --git a/xsnb-common/src/main/java/com/xsnb/common/domain/User.java b/xsnb-common/src/main/java/com/xsnb/common/domain/User.java index fcc6713..f565aac 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/domain/User.java +++ b/xsnb-common/src/main/java/com/xsnb/common/domain/User.java @@ -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; } 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 index c1f91f4..d8e7429 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java +++ b/xsnb-common/src/main/java/com/xsnb/common/domain/XmlData.java @@ -1,2 +1,40 @@ -package com.xsnb.common.domain;public class XmlData { +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; } 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 index 13b2ad7..197d8fe 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java +++ b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatException.java @@ -1,2 +1,11 @@ -package com.xsnb.common.exception;public class WechatException { +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"); + } } 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 index b946b40..6a582cd 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java +++ b/xsnb-common/src/main/java/com/xsnb/common/exception/WechatQrCodeException.java @@ -1,2 +1,7 @@ -package com.xsnb.common.exception;public class WechatQrCodeException { +package com.xsnb.common.exception; + +public class WechatQrCodeException extends WechatException{ + public WechatQrCodeException() { + super("wechat.qrCode.generate.error", null); + } } 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 index 1fa501a..545e68b 100644 --- a/xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java +++ b/xsnb-common/src/main/java/com/xsnb/common/utils/GyTelSmsUtils.java @@ -1,2 +1,44 @@ -package com.xsnb.common.utils;public class GyTelSmsUtils { +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 headers = new HashMap(); + headers.put("Authorization", "APPCODE " + appcode); + Map querys = new HashMap(); + querys.put("mobile", phone); + querys.put("templateId", "908e94ccf08b4476ba6c876d13f084ad"); + querys.put("smsSignId", "2e65b1bb3d054466b82f0c9d125465e2"); + querys.put("param", "**code**:"+code+",**minute**:5"); + Map bodys = new HashMap(); + + + 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; + } } diff --git a/xsnb-gateway/pom.xml b/xsnb-gateway/pom.xml index b08e5d5..c93afcf 100644 --- a/xsnb-gateway/pom.xml +++ b/xsnb-gateway/pom.xml @@ -43,6 +43,7 @@ com.alibaba.csp sentinel-spring-cloud-gateway-adapter + ${project.artifactId} diff --git a/xsnb-gateway/src/main/java/com/xsnb/gateway/config/IgnoreWhiteConfig.java b/xsnb-gateway/src/main/java/com/xsnb/gateway/config/IgnoreWhiteConfig.java index da647a8..b15a8ae 100644 --- a/xsnb-gateway/src/main/java/com/xsnb/gateway/config/IgnoreWhiteConfig.java +++ b/xsnb-gateway/src/main/java/com/xsnb/gateway/config/IgnoreWhiteConfig.java @@ -29,4 +29,5 @@ public class IgnoreWhiteConfig { log.info("加载网关路径白名单:{}", JSONObject.toJSONString(whites)); this.whites = whites; } + } diff --git a/xsnb-gateway/src/main/java/com/xsnb/gateway/filters/AuthFilters.java b/xsnb-gateway/src/main/java/com/xsnb/gateway/filters/AuthFilters.java index e2d726a..04f0c45 100644 --- a/xsnb-gateway/src/main/java/com/xsnb/gateway/filters/AuthFilters.java +++ b/xsnb-gateway/src/main/java/com/xsnb/gateway/filters/AuthFilters.java @@ -70,4 +70,5 @@ public class AuthFilters implements GlobalFilter, Ordered { public int getOrder() { return 0; } + } diff --git a/xsnb-gateway/src/main/resources/bootstrap.yml b/xsnb-gateway/src/main/resources/bootstrap.yml index 9bd5ea6..3805f91 100644 --- a/xsnb-gateway/src/main/resources/bootstrap.yml +++ b/xsnb-gateway/src/main/resources/bootstrap.yml @@ -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: # 服务注册地址 diff --git a/xsnb-invoiceManager/pom.xml b/xsnb-invoiceManager/pom.xml index 8bcc7c1..362fb19 100644 --- a/xsnb-invoiceManager/pom.xml +++ b/xsnb-invoiceManager/pom.xml @@ -16,5 +16,92 @@ 17 UTF-8 + + + + com.xsnb + xsnb-common + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + mysql + mysql-connector-java + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + + commons-codec + commons-codec + 1.12 + system + C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\commons-codec-1.12.jar + + + + + commons-logging + commons-logging + 1.2 + system + C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\commons-logging-1.2.jar + + + + + org.apache.httpcomponents + httpclient + 4.5.5 + system + C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\httpclient-4.5.5.jar + + + + + org.apache.httpcomponents + httpcore + 4.4.9 + system + C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\httpcore-4.4.9.jar + + + + + your-group-id-for-open-sdk + open-sdk + 1.0.5.2 + system + C:\Users\DELL7080\Desktop\server-portal\extiJar\libs\open-sdk-1.0.5.2.jar + + + diff --git a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java index 6124728..37c9911 100644 --- a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java +++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/InvoiceManagerMain.java @@ -1,2 +1,13 @@ -package com.xsnb.invoiceManager;public class InvoiceManagerMain { +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); + } } 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 index 74504db..2d55f1c 100644 --- a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java +++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/config/NonoReq.java @@ -1,2 +1,37 @@ -package com.xsnb.invoiceManager.config;public class NonoReq { +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; + } + + } 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 index f74ab3d..c0d7dd7 100644 --- a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java +++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/controller/IMController.java @@ -1,2 +1,32 @@ -package com.xsnb.invoiceManager.controller;public class IMController { +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; + } + + } 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 index 8431578..77646ae 100644 --- a/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java +++ b/xsnb-invoiceManager/src/main/java/com/xsnb/invoiceManager/domain/InvoiceConstants.java @@ -1,2 +1,164 @@ -package com.xsnb.invoiceManager.domain;public class InvoiceConstants { +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"; + /** + * 增值税特殊管理(优惠政策名称),当favouredPolicyFlag为1时,此项必填 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"; + } diff --git a/xsnb-invoiceManager/src/main/resources/bootstrap.yml b/xsnb-invoiceManager/src/main/resources/bootstrap.yml index 305b9bf..25f21b6 100644 --- a/xsnb-invoiceManager/src/main/resources/bootstrap.yml +++ b/xsnb-invoiceManager/src/main/resources/bootstrap.yml @@ -1,25 +1,7 @@ server: - port: 9002 + port: 9003 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 @@ -27,7 +9,7 @@ spring: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 application: - name: xsnb-system + name: xsnb-invoiceManager profiles: active: dev cloud: @@ -39,12 +21,3 @@ spring: 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/pom.xml b/xsnb-modules/xsnb-system/pom.xml index 0b49d66..c1390ef 100644 --- a/xsnb-modules/xsnb-system/pom.xml +++ b/xsnb-modules/xsnb-system/pom.xml @@ -77,18 +77,19 @@ org.springframework.boot spring-boot-starter-websocket - - io.minio - minio - 8.5.3 - + com.squareup.okhttp3 okhttp 4.10.0 - + + com.xsnb + xsnb-auth + 1.0.0 + compile + 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 index cb856dc..c4f1388 100644 --- 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 @@ -1,10 +1,11 @@ -package com.xsnb.common.config; +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 @@ -23,4 +24,8 @@ public class MinioConfig { .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 index 7166ad6..2e772e1 100644 --- 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 @@ -1,4 +1,4 @@ -package com.xsnb.common.config; +package com.xsnb.system.config; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; 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 index 738e1e1..ff27a44 100644 --- 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 @@ -1,2 +1,88 @@ -package com.xsnb.system.controller;public class FileController { +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 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); + } + } + diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java index 9ed5b09..1ad6676 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/MailController.java @@ -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> allListMail(User user){ - return mailService.allListMail(user); - } + public Result> allListMail(@RequestBody User user){return mailService.allListMail(user);} //删除邮件,通过传来的邮箱id来删除邮件 - @PostMapping("/deleteMail") - public Result deleteMail(Mail mail){ - return mailService.deleteMail(mail); + @PostMapping("/deleteMail/{mailId}") + public Result deleteMail(@PathVariable Long[] mailId){ + return mailService.deleteMail(mailId); } + //添加邮件,通过邮箱实体类来创建邮箱,也就是邮箱发送 @PostMapping("/addMail") public Result 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); + } + } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/UserController.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/UserController.java index 42bc7dc..99167cd 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/UserController.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/controller/UserController.java @@ -34,4 +34,6 @@ public class UserController { + + } 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 index 1fe18bc..445f684 100644 --- 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 @@ -1,71 +1,83 @@ -package com.xsnb.auth.controller; +package com.xsnb.system.controller; +import com.xsnb.common.domain.response.RespJwt; import com.xsnb.common.result.Result; -import com.xsnb.auth.GzhUtiles; -import com.xsnb.common.utils.HttpUtil; +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.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +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(getQRCode(),"获取成功"); + public Result getLoginQrCode() { + return Result.success(wechatService.getQRCode(), "获取成功"); } - public Map getQRCode() { - try { - // 获取公众号 AccessToken - String gzhAccessToken = gzhUtiles.getToken(); + /** + * 轮询查看微信的登录状态,是否可以登录,简单示例,想复杂和安全点可以使用ws + * + * @param ticket 是微信扫码返回的uuid + * @return + */ + @GetMapping("/checkLogin") + public Result checkLogin(String ticket) { + RespJwt respJwt = wechatService.checkLogin(ticket); - // 构建请求URL - String createQRCodeUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + gzhAccessToken; + return Result.success(respJwt); + } - // 构建二维码数据 - String jsonData = "{\"expire_seconds\": 600, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"login\"}}}"; + //微信返回不同请求-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"); + } - // 发起POST请求获取二维码 ticket - Map ticketMap = httpUtil.doPost(createQRCodeUrl, jsonData, 600); - String ticket = String.valueOf(ticketMap.get("ticket")); + //微信返回不同请求-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 { - 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("公众号获取异常"); + final boolean b = gzhUtiles.checkQianMing(signature, timestamp, nonce); + if (b) { + response.getOutputStream().println(echostr); + } else { + System.out.println("token验证失败"); } - - // 默认返回空 Map - return Collections.emptyMap(); } - - } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Attachment.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Attachment.java index 2b83a96..b32d374 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Attachment.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Attachment.java @@ -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; } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Mail.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Mail.java index d89c061..a15b4d8 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Mail.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/domain/Mail.java @@ -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; 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 index 98f3e91..333fa4e 100644 --- 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 @@ -1,2 +1,22 @@ -package com.xsnb.system.domain;public class WxUserLog { +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; + } 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 index 455faf5..e466563 100644 --- 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 @@ -1,18 +1,10 @@ package com.xsnb.system.mapper; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xsnb.system.domain.Attachment; +import org.apache.ibatis.annotations.Mapper; -@Data -@AllArgsConstructor -@NoArgsConstructor -@ToString -@TableName("attachment_list") -public class Attachment { +@Mapper +public interface AttachmentMapper extends BaseMapper { - - } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/MailMapper.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/MailMapper.java index cab2bcd..7ca1e3e 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/MailMapper.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/mapper/MailMapper.java @@ -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 { + int deleteBatchIds(@Param("ids") List ids); + } 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 index 22e09d7..fadb852 100644 --- 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 @@ -1,2 +1,9 @@ -package com.xsnb.system.mapper;public interface WxUserLogMapper { +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 { } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/rabbitMQ/MessageConsumerService.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/rabbitMQ/MessageConsumerService.java index 3817803..71793e2 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/rabbitMQ/MessageConsumerService.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/rabbitMQ/MessageConsumerService.java @@ -24,6 +24,9 @@ public class MessageConsumerService { private RedisTemplate 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() {{ put("code",code); }}); + /* gyTelSmsUtils.sendPhone(phone,code);*/ redisTemplate.opsForValue().set(phone,code); SendSmsResponseBody sendSmsResponseBody = JSONObject.parseObject(jsons, SendSmsResponseBody.class); if(!"OK".equals(sendSmsResponseBody.getCode())){ diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/MailService.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/MailService.java index 6dac606..d53c4d2 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/MailService.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/MailService.java @@ -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> allListMail(User user); - Result deleteMail(Mail mail); + Result deleteMail(Long[] delId); Result addMail(Mail mail); + + /** + * 修改为已读 + * @param mail + * @return + */ + Result reading(Mail mail); + + Result addAttachment(Mail mail, MultipartFile file); + + Result copyMail(Mail mail); } 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 index 79169b0..7aa8ab8 100644 --- 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 @@ -1,2 +1,12 @@ -package com.xsnb.system.service;public interface WechatService { +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); } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/MailServiceImpl.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/MailServiceImpl.java index b28f450..c829d09 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/MailServiceImpl.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/MailServiceImpl.java @@ -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> allListMail(User user) { QueryWrapper qw = new QueryWrapper<>(); - qw.eq("user_id", user.getId()); - List 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 = mapper.selectList(qw); + return Result.success(mail); } /** - * @param mail + * @param delIds * @return */ @Override - public Result 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 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; + } + + } diff --git a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/UserServiceImpl.java b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/UserServiceImpl.java index e99cf1e..afc3c09 100644 --- a/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/UserServiceImpl.java +++ b/xsnb-modules/xsnb-system/src/main/java/com/xsnb/system/service/impl/UserServiceImpl.java @@ -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 byphone(String phone) { QueryWrapper 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; + + }*/ + + + } 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 index b7ff6ec..71b0f94 100644 --- 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 @@ -1,6 +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 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 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 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 wrapper = new QueryWrapper<>(); + QueryWrapper 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 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 wrapper = new QueryWrapper<>(); + QueryWrapper 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; + } } 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 index 12d4e03..72f96d5 100644 --- 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 @@ -1,4 +1,4 @@ -package com.xsnb.auth; +package com.xsnb.system.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -11,7 +11,6 @@ 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; @@ -42,7 +41,7 @@ public class GzhUtiles { AppSecret = env.getProperty("wx.AppSecret"); appid = env.getProperty("wx.appid"); - TOKEN = env.getProperty("wx.gzhTooken"); + TOKEN = env.getProperty("wx.gzhToken"); } @@ -56,29 +55,21 @@ public class GzhUtiles { * @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(); @@ -93,12 +84,8 @@ public class GzhUtiles { * @return */ public String getToken() { - - // 判断数据是否存在 Boolean gzhAccessToken = redisTemplate.hasKey("gzh_access_token"); - - //存入缓存 存在两小时 //三秒 if (!gzhAccessToken) { @@ -112,7 +99,6 @@ public class GzhUtiles { 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; @@ -184,25 +170,17 @@ public class GzhUtiles { * @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; + return (XmlData)JAXBContext + .newInstance(XmlData.class) + .createUnmarshaller() + .unmarshal( + new StringReader(unescapedXml) + ); } 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 index 1a76376..de1c258 100644 --- 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 @@ -1,4 +1,4 @@ -package com.xsnb.common.utils; +package com.xsnb.system.utils; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; 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 index 37219b4..bf5be55 100644 --- 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 @@ -1,7 +1,7 @@ -package com.xsnb.common.utils.minio; +package com.xsnb.system.utils.minio; import com.alibaba.nacos.common.utils.UuidUtils; -import com.xsnb.common.config.MinioConfig; +import com.xsnb.system.config.MinioConfig; import com.xsnb.common.utils.StringUtils; import io.minio.*; import io.minio.http.Method; diff --git a/xsnb-modules/xsnb-system/src/main/resources/bootstrap.yml b/xsnb-modules/xsnb-system/src/main/resources/bootstrap.yml index 305b9bf..f29f0c1 100644 --- a/xsnb-modules/xsnb-system/src/main/resources/bootstrap.yml +++ b/xsnb-modules/xsnb-system/src/main/resources/bootstrap.yml @@ -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