48 changed files with 995 additions and 573 deletions
@ -0,0 +1,14 @@ |
|||||
|
# EditorConfig: http://editorconfig.org/ |
||||
|
|
||||
|
root = true |
||||
|
|
||||
|
[*] |
||||
|
indent_style = space |
||||
|
indent_size = 4 |
||||
|
end_of_line = lf |
||||
|
charset = utf-8 |
||||
|
trim_trailing_whitespace = true |
||||
|
insert_final_newline = true |
||||
|
|
||||
|
[*.md] |
||||
|
trim_trailing_whitespace = false |
||||
@ -0,0 +1,13 @@ |
|||||
|
language: java |
||||
|
jdk: |
||||
|
- openjdk8 |
||||
|
|
||||
|
script: "mvn clean package -Dmaven.test.skip=true" |
||||
|
|
||||
|
branches: |
||||
|
only: |
||||
|
- master |
||||
|
|
||||
|
notifications: |
||||
|
email: |
||||
|
- binarywang@vip.qq.com |
||||
@ -0,0 +1,58 @@ |
|||||
|
[](https://gitee.com/binary/weixin-java-mp-demo-springboot) |
||||
|
[](https://github.com/binarywang/weixin-java-mp-demo-springboot) |
||||
|
[](https://travis-ci.org/binarywang/weixin-java-mp-demo-springboot) |
||||
|
----------------------- |
||||
|
|
||||
|
### 本Demo基于Spring Boot构建,实现微信公众号后端开发功能。 |
||||
|
### 本项目为WxJava的Demo演示程序,更多Demo请[查阅此处](https://github.com/Wechat-Group/WxJava/blob/master/demo.md)。 |
||||
|
#### 如有问题请[【在此提问】](https://github.com/binarywang/weixin-java-mp-demo-springboot/issues),谢谢配合。 |
||||
|
|
||||
|
<table border="0"> |
||||
|
<tbody> |
||||
|
<tr> |
||||
|
<td align="left" valign="middle"> |
||||
|
<a href="http://mp.weixin.qq.com/mp/homepage?__biz=MzI3MzAwMzk4OA==&hid=1&sn=f31af3bf562b116b061c9ab4edf70b61&scene=18#wechat_redirect" target="_blank"> |
||||
|
<img height="120" src="https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"> |
||||
|
</a> |
||||
|
</td> |
||||
|
<td align="center" valign="middle"> |
||||
|
<a href="https://cloud.tencent.com/redirect.php?redirect=1014&cps_key=a4c06ffe004dbcda44036daa1bf8f876&from=console" target="_blank"> |
||||
|
<img height="120" src="https://gitee.com/binary/weixin-java-tools/raw/master/images/banners/tcloud.jpg"> |
||||
|
</a> |
||||
|
</td> |
||||
|
<td align="right" valign="middle"> |
||||
|
<a href="https://coding.net/?utm_source=WxJava" target="_blank"> |
||||
|
<img height="120" src="https://gitee.com/binary/weixin-java-tools/raw/master/images/banners/coding.jpg"> |
||||
|
</a> |
||||
|
</td> |
||||
|
<td align="center" valign="middle"> |
||||
|
<a href="https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=7makzf5h" target="_blank"> |
||||
|
<img height="120" src="https://gitee.com/binary/weixin-java-tools/raw/master/images/banners/aliyun.jpg"> |
||||
|
</a> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
|
||||
|
## 使用步骤: |
||||
|
1. 请注意,本demo为简化代码编译时加入了lombok支持,如果不了解lombok的话,请先学习下相关知识,比如可以阅读[此文章](https://mp.weixin.qq.com/s/cUc-bUcprycADfNepnSwZQ); |
||||
|
1. 另外,新手遇到问题,请务必先阅读[【开发文档首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。 |
||||
|
1. 配置:复制 `/src/main/resources/application.yml.template` 或修改其扩展名生成 `application.yml` 文件,根据自己需要填写相关配置(需要注意的是:yml文件内的属性冒号后面的文字之前需要加空格,可参考已有配置,否则属性会设置不成功); |
||||
|
2. 主要配置说明如下: |
||||
|
``` |
||||
|
wx: |
||||
|
mp: |
||||
|
configs: |
||||
|
- appId: 1111 (一个公众号的appid) |
||||
|
secret: 1111(公众号的appsecret) |
||||
|
token: 111 (接口配置里的Token值) |
||||
|
aesKey: 111 (接口配置里的EncodingAESKey值) |
||||
|
- appId: 2222 (另一个公众号的appid,以下同上) |
||||
|
secret: 1111 |
||||
|
token: 111 |
||||
|
aesKey: 111 |
||||
|
``` |
||||
|
3. 运行Java程序:`WxMpDemoApplication`; |
||||
|
4. 配置微信公众号中的接口地址:http://公网可访问域名/wx/portal/xxxxx (注意,xxxxx为对应公众号的appid值); |
||||
|
5. 根据自己需要修改各个handler的实现,加入自己的业务逻辑。 |
||||
|
|
||||
@ -0,0 +1,61 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
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.esua.epdc</groupId> |
||||
|
<artifactId>epdc-commons</artifactId> |
||||
|
<version>1.0.0</version> |
||||
|
</parent> |
||||
|
|
||||
|
<version>1.0.0</version> |
||||
|
<artifactId>epdc-wx</artifactId> |
||||
|
<packaging>jar</packaging> |
||||
|
|
||||
|
<name>Wechat mp demo with Spring Boot and WxJava</name> |
||||
|
<description>基于 WxJava 和 Spring Boot 实现的微信公众号后端开发演示项目</description> |
||||
|
|
||||
|
<properties> |
||||
|
<weixin-java-mp.version>3.5.0</weixin-java-mp.version> |
||||
|
|
||||
|
<maven.compiler.source>1.8</maven.compiler.source> |
||||
|
<maven.compiler.target>1.8</maven.compiler.target> |
||||
|
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> |
||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
|
<project.build.locales>zh_CN</project.build.locales> |
||||
|
<docker.image.prefix>wechat-mp-demo</docker.image.prefix> |
||||
|
</properties> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>com.github.binarywang</groupId> |
||||
|
<artifactId>weixin-java-mp</artifactId> |
||||
|
<version>${weixin-java-mp.version}</version> |
||||
|
</dependency> |
||||
|
|
||||
|
<dependency> |
||||
|
<groupId>org.projectlombok</groupId> |
||||
|
<artifactId>lombok</artifactId> |
||||
|
<scope>provided</scope> |
||||
|
</dependency> |
||||
|
|
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-autoconfigure</artifactId> |
||||
|
<scope>compile</scope> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-configuration-processor</artifactId> |
||||
|
<scope>compile</scope> |
||||
|
<optional>true</optional> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-autoconfigure-processor</artifactId> |
||||
|
<scope>compile</scope> |
||||
|
<optional>true</optional> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
</project> |
||||
@ -0,0 +1,17 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.builder; |
||||
|
|
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
public abstract class AbstractBuilder { |
||||
|
protected final Logger logger = LoggerFactory.getLogger(getClass()); |
||||
|
|
||||
|
public abstract WxMpXmlOutMessage build(String content, |
||||
|
WxMpXmlMessage wxMessage, WxMpService service); |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.builder; |
||||
|
|
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
public class ImageBuilder extends AbstractBuilder { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, |
||||
|
WxMpService service) { |
||||
|
|
||||
|
WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content) |
||||
|
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) |
||||
|
.build(); |
||||
|
|
||||
|
return m; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.builder; |
||||
|
|
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
public class TextBuilder extends AbstractBuilder { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, |
||||
|
WxMpService service) { |
||||
|
WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) |
||||
|
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) |
||||
|
.build(); |
||||
|
return m; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,113 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.config; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.handler.*; |
||||
|
import lombok.AllArgsConstructor; |
||||
|
import me.chanjar.weixin.mp.api.WxMpMessageRouter; |
||||
|
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.boot.context.properties.EnableConfigurationProperties; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
import static me.chanjar.weixin.common.api.WxConsts.EventType; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.EventType.UNSUBSCRIBE; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType.CLICK; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType.VIEW; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; |
||||
|
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT; |
||||
|
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.*; |
||||
|
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY; |
||||
|
|
||||
|
/** |
||||
|
* wechat mp configuration |
||||
|
* |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@AllArgsConstructor |
||||
|
@Configuration |
||||
|
@EnableConfigurationProperties(WxMpProperties.class) |
||||
|
public class WxMpConfiguration { |
||||
|
private final LogHandler logHandler; |
||||
|
private final NullHandler nullHandler; |
||||
|
private final KfSessionHandler kfSessionHandler; |
||||
|
private final StoreCheckNotifyHandler storeCheckNotifyHandler; |
||||
|
private final LocationHandler locationHandler; |
||||
|
private final MenuHandler menuHandler; |
||||
|
private final MsgHandler msgHandler; |
||||
|
private final UnsubscribeHandler unsubscribeHandler; |
||||
|
private final SubscribeHandler subscribeHandler; |
||||
|
private final ScanHandler scanHandler; |
||||
|
private final WxMpProperties properties; |
||||
|
|
||||
|
@Bean |
||||
|
public WxMpService wxMpService() { |
||||
|
// 代码里 getConfigs()处报错的同学,请注意仔细阅读项目说明,你的IDE需要引入lombok插件!!!!
|
||||
|
final List<WxMpProperties.MpConfig> configs = this.properties.getConfigs(); |
||||
|
if (configs == null) { |
||||
|
throw new RuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!"); |
||||
|
} |
||||
|
|
||||
|
WxMpService service = new WxMpServiceImpl(); |
||||
|
service.setMultiConfigStorages(configs |
||||
|
.stream().map(a -> { |
||||
|
WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl(); |
||||
|
configStorage.setAppId(a.getAppId()); |
||||
|
configStorage.setSecret(a.getSecret()); |
||||
|
configStorage.setToken(a.getToken()); |
||||
|
configStorage.setAesKey(a.getAesKey()); |
||||
|
return configStorage; |
||||
|
}).collect(Collectors.toMap(WxMpDefaultConfigImpl::getAppId, a -> a, (o, n) -> o))); |
||||
|
return service; |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public WxMpMessageRouter messageRouter(WxMpService wxMpService) { |
||||
|
final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService); |
||||
|
|
||||
|
// 记录所有事件的日志 (异步执行)
|
||||
|
newRouter.rule().handler(this.logHandler).next(); |
||||
|
|
||||
|
// 接收客服会话管理事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION) |
||||
|
.handler(this.kfSessionHandler).end(); |
||||
|
newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION) |
||||
|
.handler(this.kfSessionHandler).end(); |
||||
|
newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION) |
||||
|
.handler(this.kfSessionHandler).end(); |
||||
|
|
||||
|
// 门店审核事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(this.storeCheckNotifyHandler).end(); |
||||
|
|
||||
|
// 自定义菜单事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(CLICK).handler(this.menuHandler).end(); |
||||
|
|
||||
|
// 点击菜单连接事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(VIEW).handler(this.nullHandler).end(); |
||||
|
|
||||
|
// 关注事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end(); |
||||
|
|
||||
|
// 取消关注事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end(); |
||||
|
|
||||
|
// 上报地理位置事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(EventType.LOCATION).handler(this.locationHandler).end(); |
||||
|
|
||||
|
// 接收地理位置消息
|
||||
|
newRouter.rule().async(false).msgType(XmlMsgType.LOCATION).handler(this.locationHandler).end(); |
||||
|
|
||||
|
// 扫码事件
|
||||
|
newRouter.rule().async(false).msgType(EVENT).event(EventType.SCAN).handler(this.scanHandler).end(); |
||||
|
|
||||
|
// 默认
|
||||
|
newRouter.rule().async(false).handler(this.msgHandler).end(); |
||||
|
|
||||
|
return newRouter; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.config; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.utils.JsonUtils; |
||||
|
import lombok.Data; |
||||
|
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* wechat mp properties |
||||
|
* |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Data |
||||
|
@ConfigurationProperties(prefix = "wx.mp") |
||||
|
public class WxMpProperties { |
||||
|
private List<MpConfig> configs; |
||||
|
|
||||
|
@Data |
||||
|
public static class MpConfig { |
||||
|
/** |
||||
|
* 设置微信公众号的appid |
||||
|
*/ |
||||
|
private String appId; |
||||
|
|
||||
|
/** |
||||
|
* 设置微信公众号的app secret |
||||
|
*/ |
||||
|
private String secret; |
||||
|
|
||||
|
/** |
||||
|
* 设置微信公众号的token |
||||
|
*/ |
||||
|
private String token; |
||||
|
|
||||
|
/** |
||||
|
* 设置微信公众号的EncodingAESKey |
||||
|
*/ |
||||
|
private String aesKey; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return JsonUtils.toJson(this); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.mp.api.WxMpMessageHandler; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
public abstract class AbstractHandler implements WxMpMessageHandler { |
||||
|
protected Logger logger = LoggerFactory.getLogger(getClass()); |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class KfSessionHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
//TODO 对会话做处理
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,44 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.builder.TextBuilder; |
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class LocationHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
if (wxMessage.getMsgType().equals(XmlMsgType.LOCATION)) { |
||||
|
//TODO 接收处理用户发送的地理位置消息
|
||||
|
try { |
||||
|
String content = "感谢反馈,您的的地理位置已收到!"; |
||||
|
return new TextBuilder().build(content, wxMessage, null); |
||||
|
} catch (Exception e) { |
||||
|
this.logger.error("位置消息接收处理失败", e); |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//上报地理位置事件
|
||||
|
this.logger.info("上报地理位置,纬度 : {},经度 : {},精度 : {}", |
||||
|
wxMessage.getLatitude(), wxMessage.getLongitude(), String.valueOf(wxMessage.getPrecision())); |
||||
|
|
||||
|
//TODO 可以将用户地理位置信息保存到本地数据库,以便以后使用
|
||||
|
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.utils.JsonUtils; |
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class LogHandler extends AbstractHandler { |
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
this.logger.info("\n接收到请求消息,内容:{}", JsonUtils.toJson(wxMessage)); |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class MenuHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService weixinService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
|
||||
|
String msg = String.format("type:%s, event:%s, key:%s", |
||||
|
wxMessage.getMsgType(), wxMessage.getEvent(), |
||||
|
wxMessage.getEventKey()); |
||||
|
if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
return WxMpXmlOutMessage.TEXT().content(msg) |
||||
|
.fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) |
||||
|
.build(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.builder.TextBuilder; |
||||
|
import com.elink.esua.epdc.wx.mp.utils.JsonUtils; |
||||
|
import me.chanjar.weixin.common.error.WxErrorException; |
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class MsgHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService weixinService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
|
||||
|
if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) { |
||||
|
//TODO 可以选择将消息保存到本地
|
||||
|
} |
||||
|
|
||||
|
//当用户输入关键词如“你好”,“客服”等,并且有客服在线时,把消息转发给在线客服
|
||||
|
try { |
||||
|
if (StringUtils.startsWithAny(wxMessage.getContent(), "你好", "客服") |
||||
|
&& weixinService.getKefuService().kfOnlineList() |
||||
|
.getKfOnlineList().size() > 0) { |
||||
|
return WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE() |
||||
|
.fromUser(wxMessage.getToUser()) |
||||
|
.toUser(wxMessage.getFromUser()).build(); |
||||
|
} |
||||
|
} catch (WxErrorException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
|
||||
|
//TODO 组装回复消息
|
||||
|
String content = "收到信息内容:" + JsonUtils.toJson(wxMessage); |
||||
|
|
||||
|
return new TextBuilder().build(content, wxMessage, weixinService); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class NullHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import me.chanjar.weixin.common.error.WxErrorException; |
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class ScanHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMpXmlMessage, Map<String, Object> map, |
||||
|
WxMpService wxMpService, WxSessionManager wxSessionManager) throws WxErrorException { |
||||
|
// 扫码事件处理
|
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 门店审核事件处理 |
||||
|
* |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class StoreCheckNotifyHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
// TODO 处理门店审核事件
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,71 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
import com.elink.esua.epdc.wx.mp.builder.TextBuilder; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import me.chanjar.weixin.common.error.WxErrorException; |
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import me.chanjar.weixin.mp.bean.result.WxMpUser; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class SubscribeHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService weixinService, |
||||
|
WxSessionManager sessionManager) throws WxErrorException { |
||||
|
|
||||
|
this.logger.info("新关注用户 OPENID: " + wxMessage.getFromUser()); |
||||
|
|
||||
|
// 获取微信用户基本信息
|
||||
|
try { |
||||
|
WxMpUser userWxInfo = weixinService.getUserService() |
||||
|
.userInfo(wxMessage.getFromUser(), null); |
||||
|
if (userWxInfo != null) { |
||||
|
// TODO 可以添加关注用户到本地数据库
|
||||
|
} |
||||
|
} catch (WxErrorException e) { |
||||
|
if (e.getError().getErrorCode() == 48001) { |
||||
|
this.logger.info("该公众号没有获取用户信息权限!"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
WxMpXmlOutMessage responseResult = null; |
||||
|
try { |
||||
|
responseResult = this.handleSpecial(wxMessage); |
||||
|
} catch (Exception e) { |
||||
|
this.logger.error(e.getMessage(), e); |
||||
|
} |
||||
|
|
||||
|
if (responseResult != null) { |
||||
|
return responseResult; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
return new TextBuilder().build("感谢关注", wxMessage, weixinService); |
||||
|
} catch (Exception e) { |
||||
|
this.logger.error(e.getMessage(), e); |
||||
|
} |
||||
|
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理特殊请求,比如如果是扫码进来的,可以做相应处理 |
||||
|
*/ |
||||
|
private WxMpXmlOutMessage handleSpecial(WxMpXmlMessage wxMessage) |
||||
|
throws Exception { |
||||
|
//TODO
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.handler; |
||||
|
|
||||
|
import me.chanjar.weixin.common.session.WxSessionManager; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
@Component |
||||
|
public class UnsubscribeHandler extends AbstractHandler { |
||||
|
|
||||
|
@Override |
||||
|
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, |
||||
|
Map<String, Object> context, WxMpService wxMpService, |
||||
|
WxSessionManager sessionManager) { |
||||
|
String openId = wxMessage.getFromUser(); |
||||
|
this.logger.info("取消关注用户 OPENID: " + openId); |
||||
|
// TODO 可以更新本地数据库为取消关注状态
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
package com.elink.esua.epdc.wx.mp.utils; |
||||
|
|
||||
|
import com.google.gson.Gson; |
||||
|
import com.google.gson.GsonBuilder; |
||||
|
|
||||
|
/** |
||||
|
* @author Binary Wang(https://github.com/binarywang)
|
||||
|
*/ |
||||
|
public class JsonUtils { |
||||
|
public static String toJson(Object obj) { |
||||
|
Gson gson = new GsonBuilder() |
||||
|
.setPrettyPrinting() |
||||
|
.create(); |
||||
|
return gson.toJson(obj); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
package com.elink.esua.epdc.wx.controller; |
||||
|
|
||||
|
import com.elink.esua.epdc.commons.tools.utils.Result; |
||||
|
import com.elink.esua.epdc.wx.service.WxService; |
||||
|
import me.chanjar.weixin.common.bean.WxJsapiSignature; |
||||
|
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; |
||||
|
|
||||
|
/** |
||||
|
* 微信Controller |
||||
|
* |
||||
|
* @author rongchao |
||||
|
* @Date 19-9-4 |
||||
|
*/ |
||||
|
@RestController |
||||
|
@RequestMapping("wx") |
||||
|
public class WxController { |
||||
|
|
||||
|
@Autowired |
||||
|
private WxService wxService; |
||||
|
|
||||
|
/** |
||||
|
* 获取用户信息 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
@GetMapping("getWxConfig") |
||||
|
public Result<WxJsapiSignature> getWxConfig(String url) { |
||||
|
return wxService.getWxConfig(url); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
package com.elink.esua.epdc.wx.service; |
||||
|
|
||||
|
import com.elink.esua.epdc.commons.tools.utils.Result; |
||||
|
import me.chanjar.weixin.common.bean.WxJsapiSignature; |
||||
|
|
||||
|
/** |
||||
|
* 微信接口类 |
||||
|
* |
||||
|
* @author rongchao |
||||
|
* @Date 19-9-4 |
||||
|
*/ |
||||
|
public interface WxService { |
||||
|
|
||||
|
/** |
||||
|
* 获取微信jssdk配置信息 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
Result<WxJsapiSignature> getWxConfig(String url); |
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
package com.elink.esua.epdc.wx.service.impl; |
||||
|
|
||||
|
import com.elink.esua.epdc.commons.tools.exception.RenException; |
||||
|
import com.elink.esua.epdc.commons.tools.utils.Result; |
||||
|
import com.elink.esua.epdc.wx.service.WxService; |
||||
|
import me.chanjar.weixin.common.bean.WxJsapiSignature; |
||||
|
import me.chanjar.weixin.common.error.WxErrorException; |
||||
|
import me.chanjar.weixin.mp.api.WxMpService; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
/** |
||||
|
* 微信相关服务实现类 |
||||
|
* |
||||
|
* @author rongchao |
||||
|
* @Date 19-9-4 |
||||
|
*/ |
||||
|
@Service |
||||
|
public class WxServiceImpl implements WxService { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(getClass()); |
||||
|
|
||||
|
@Autowired |
||||
|
private WxMpService wxMpService; |
||||
|
|
||||
|
@Override |
||||
|
public Result<WxJsapiSignature> getWxConfig(String url) { |
||||
|
try { |
||||
|
WxJsapiSignature wxJsapiSignature = wxMpService.createJsapiSignature(url); |
||||
|
return new Result<WxJsapiSignature>().ok(wxJsapiSignature); |
||||
|
} catch (WxErrorException e) { |
||||
|
log.error("获取微信Jssdk相关配置失败"); |
||||
|
throw new RenException("获取微信Jssdk相关配置失败"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,53 +0,0 @@ |
|||||
<?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"> |
|
||||
<parent> |
|
||||
<artifactId>epdc-app</artifactId> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<version>1.0.0</version> |
|
||||
</parent> |
|
||||
<modelVersion>4.0.0</modelVersion> |
|
||||
|
|
||||
<artifactId>epdc-app-client</artifactId> |
|
||||
<packaging>jar</packaging> |
|
||||
|
|
||||
<dependencies> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-commons-tools</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-heart-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-neighbor-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-news-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-events-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-services-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-user-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
</dependencies> |
|
||||
|
|
||||
</project> |
|
||||
@ -1,146 +0,0 @@ |
|||||
<?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"> |
|
||||
<parent> |
|
||||
<artifactId>epdc-app</artifactId> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<version>1.0.0</version> |
|
||||
</parent> |
|
||||
<modelVersion>4.0.0</modelVersion> |
|
||||
|
|
||||
<artifactId>epdc-app-server</artifactId> |
|
||||
<packaging>jar</packaging> |
|
||||
|
|
||||
<dependencies> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-app-client</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-commons-tools</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<artifactId>epdc-commons-mybatis</artifactId> |
|
||||
<version>1.0.0</version> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>org.springframework.boot</groupId> |
|
||||
<artifactId>spring-boot-starter-web</artifactId> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>org.springframework</groupId> |
|
||||
<artifactId>spring-context-support</artifactId> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>com.alibaba.cloud</groupId> |
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
|
||||
</dependency> |
|
||||
<dependency> |
|
||||
<groupId>de.codecentric</groupId> |
|
||||
<artifactId>spring-boot-admin-starter-client</artifactId> |
|
||||
<version>${spring.boot.admin.version}</version> |
|
||||
</dependency> |
|
||||
</dependencies> |
|
||||
|
|
||||
<build> |
|
||||
<finalName>${project.artifactId}</finalName> |
|
||||
<plugins> |
|
||||
<plugin> |
|
||||
<groupId>org.springframework.boot</groupId> |
|
||||
<artifactId>spring-boot-maven-plugin</artifactId> |
|
||||
</plugin> |
|
||||
<plugin> |
|
||||
<groupId>org.apache.maven.plugins</groupId> |
|
||||
<artifactId>maven-surefire-plugin</artifactId> |
|
||||
<configuration> |
|
||||
<skipTests>true</skipTests> |
|
||||
</configuration> |
|
||||
</plugin> |
|
||||
<plugin> |
|
||||
<groupId>com.spotify</groupId> |
|
||||
<artifactId>docker-maven-plugin</artifactId> |
|
||||
</plugin> |
|
||||
</plugins> |
|
||||
</build> |
|
||||
|
|
||||
|
|
||||
<profiles> |
|
||||
<profile> |
|
||||
<id>dev</id> |
|
||||
<activation> |
|
||||
<activeByDefault>true</activeByDefault> |
|
||||
</activation> |
|
||||
<properties> |
|
||||
<spring.profiles.active>dev</spring.profiles.active> |
|
||||
|
|
||||
<server.port>9058</server.port> |
|
||||
|
|
||||
<spring.redis.index>2</spring.redis.index> |
|
||||
<spring.redis.host>47.104.224.45</spring.redis.host> |
|
||||
<spring.redis.port>6379</spring.redis.port> |
|
||||
<spring.redis.password>elink@888</spring.redis.password> |
|
||||
|
|
||||
<spring.datasource.druid.url> |
|
||||
<![CDATA[jdbc:mysql://47.104.224.45:3308/epdc_demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]> |
|
||||
</spring.datasource.druid.url> |
|
||||
<spring.datasource.druid.username>epdc</spring.datasource.druid.username> |
|
||||
<spring.datasource.druid.password>elink888</spring.datasource.druid.password> |
|
||||
|
|
||||
<nacos.register-enabled>false</nacos.register-enabled> |
|
||||
<nacos.server-addr>47.104.224.45:8848</nacos.server-addr> |
|
||||
</properties> |
|
||||
</profile> |
|
||||
|
|
||||
<profile> |
|
||||
<id>test</id> |
|
||||
<properties> |
|
||||
<spring.profiles.active>test</spring.profiles.active> |
|
||||
|
|
||||
<server.port>9058</server.port> |
|
||||
|
|
||||
<spring.redis.index>2</spring.redis.index> |
|
||||
<spring.redis.host>47.104.224.45</spring.redis.host> |
|
||||
<spring.redis.port>6379</spring.redis.port> |
|
||||
<spring.redis.password>elink@888</spring.redis.password> |
|
||||
|
|
||||
<spring.datasource.druid.url> |
|
||||
<![CDATA[jdbc:mysql://47.104.224.45:3308/esua_epdc_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]> |
|
||||
</spring.datasource.druid.url> |
|
||||
<spring.datasource.druid.username>epdc</spring.datasource.druid.username> |
|
||||
<spring.datasource.druid.password>elink888</spring.datasource.druid.password> |
|
||||
|
|
||||
<nacos.register-enabled>false</nacos.register-enabled> |
|
||||
<nacos.server-addr>47.104.224.45:8848</nacos.server-addr> |
|
||||
</properties> |
|
||||
</profile> |
|
||||
|
|
||||
<profile> |
|
||||
<id>prod</id> |
|
||||
<properties> |
|
||||
<spring.profiles.active>prod</spring.profiles.active> |
|
||||
|
|
||||
<server.port>9058</server.port> |
|
||||
|
|
||||
<spring.redis.index>2</spring.redis.index> |
|
||||
<spring.redis.host>47.104.224.45</spring.redis.host> |
|
||||
<spring.redis.port>6379</spring.redis.port> |
|
||||
<spring.redis.password>elink@888</spring.redis.password> |
|
||||
|
|
||||
<spring.datasource.druid.url> |
|
||||
<![CDATA[jdbc:mysql://47.104.224.45:3308/esua_epdc_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]> |
|
||||
</spring.datasource.druid.url> |
|
||||
<spring.datasource.druid.username>epdc</spring.datasource.druid.username> |
|
||||
<spring.datasource.druid.password>elink888</spring.datasource.druid.password> |
|
||||
|
|
||||
<nacos.register-enabled>false</nacos.register-enabled> |
|
||||
<nacos.server-addr>47.104.224.45:8848</nacos.server-addr> |
|
||||
</properties> |
|
||||
</profile> |
|
||||
</profiles> |
|
||||
|
|
||||
</project> |
|
||||
@ -1,31 +0,0 @@ |
|||||
/** |
|
||||
* Copyright (c) 2018 人人开源 All rights reserved. |
|
||||
* <p> |
|
||||
* https://www.renren.io
|
|
||||
* <p> |
|
||||
* 版权所有,侵权必究! |
|
||||
*/ |
|
||||
|
|
||||
package com.elink.esua.epdc; |
|
||||
|
|
||||
import org.springframework.boot.SpringApplication; |
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; |
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients; |
|
||||
|
|
||||
/** |
|
||||
* 移动端接口模块 |
|
||||
* |
|
||||
* @author Mark sunlightcs@gmail.com |
|
||||
* @since 1.1.0 |
|
||||
*/ |
|
||||
@SpringBootApplication |
|
||||
@EnableDiscoveryClient |
|
||||
@EnableFeignClients |
|
||||
public class AppApplication { |
|
||||
|
|
||||
public static void main(String[] args) { |
|
||||
SpringApplication.run(AppApplication.class, args); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
@ -1,26 +0,0 @@ |
|||||
/** |
|
||||
* Copyright (c) 2018 人人开源 All rights reserved. |
|
||||
* <p> |
|
||||
* https://www.renren.io
|
|
||||
* <p> |
|
||||
* 版权所有,侵权必究! |
|
||||
*/ |
|
||||
|
|
||||
package com.elink.esua.epdc.config; |
|
||||
|
|
||||
import com.elink.esua.epdc.commons.tools.config.ModuleConfig; |
|
||||
import org.springframework.stereotype.Service; |
|
||||
|
|
||||
/** |
|
||||
* 模块配置信息-移动端接口模块 |
|
||||
* |
|
||||
* @author Mark sunlightcs@gmail.com |
|
||||
* @since 1.0.0 |
|
||||
*/ |
|
||||
@Service |
|
||||
public class ModuleConfigImpl implements ModuleConfig { |
|
||||
@Override |
|
||||
public String getName() { |
|
||||
return "app"; |
|
||||
} |
|
||||
} |
|
||||
@ -1,34 +0,0 @@ |
|||||
/** |
|
||||
* Copyright (c) 2018 人人开源 All rights reserved. |
|
||||
* <p> |
|
||||
* https://www.renren.io
|
|
||||
* <p> |
|
||||
* 版权所有,侵权必究! |
|
||||
*/ |
|
||||
|
|
||||
package com.elink.esua.epdc.config; |
|
||||
|
|
||||
import com.elink.esua.epdc.commons.tools.resolver.LoginUserHandlerMethodArgumentResolver; |
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||
import org.springframework.context.annotation.Configuration; |
|
||||
import org.springframework.web.method.support.HandlerMethodArgumentResolver; |
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
|
||||
|
|
||||
import java.util.List; |
|
||||
|
|
||||
/** |
|
||||
* MVC配置 |
|
||||
* |
|
||||
* @author Mark sunlightcs@gmail.com |
|
||||
*/ |
|
||||
@Configuration |
|
||||
public class WebConfig implements WebMvcConfigurer { |
|
||||
|
|
||||
@Autowired |
|
||||
private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; |
|
||||
|
|
||||
@Override |
|
||||
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { |
|
||||
argumentResolvers.add(loginUserHandlerMethodArgumentResolver); |
|
||||
} |
|
||||
} |
|
||||
@ -1,68 +0,0 @@ |
|||||
server: |
|
||||
port: @server.port@ |
|
||||
servlet: |
|
||||
context-path: /epdc-app |
|
||||
|
|
||||
spring: |
|
||||
application: |
|
||||
name: epdc-app-server |
|
||||
# 环境 dev|test|prod |
|
||||
profiles: |
|
||||
active: @spring.profiles.active@ |
|
||||
messages: |
|
||||
encoding: UTF-8 |
|
||||
basename: i18n/messages,i18n/messages_common |
|
||||
jackson: |
|
||||
time-zone: GMT+8 |
|
||||
date-format: yyyy-MM-dd HH:mm:ss |
|
||||
redis: |
|
||||
database: @spring.redis.index@ |
|
||||
host: @spring.redis.host@ |
|
||||
timeout: 30s |
|
||||
port: @spring.redis.port@ |
|
||||
password: @spring.redis.password@ |
|
||||
cloud: |
|
||||
nacos: |
|
||||
discovery: |
|
||||
server-addr: @nacos.server-addr@ |
|
||||
register-enabled: @nacos.register-enabled@ |
|
||||
alibaba: |
|
||||
seata: |
|
||||
tx-service-group: epdc-app-server-fescar-service-group |
|
||||
datasource: |
|
||||
druid: |
|
||||
driver-class-name: com.mysql.jdbc.Driver |
|
||||
url: @spring.datasource.druid.url@ |
|
||||
username: @spring.datasource.druid.username@ |
|
||||
password: @spring.datasource.druid.password@ |
|
||||
|
|
||||
|
|
||||
management: |
|
||||
endpoints: |
|
||||
web: |
|
||||
exposure: |
|
||||
include: "*" |
|
||||
endpoint: |
|
||||
health: |
|
||||
show-details: ALWAYS |
|
||||
|
|
||||
mybatis-plus: |
|
||||
mapper-locations: classpath:/mapper/**/*.xml |
|
||||
#实体扫描,多个package用逗号或者分号分隔 |
|
||||
typeAliasesPackage: io.renren.entity;com.elink.esua.epdc.entity |
|
||||
global-config: |
|
||||
#数据库相关配置 |
|
||||
db-config: |
|
||||
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; |
|
||||
id-type: ID_WORKER |
|
||||
#字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" |
|
||||
field-strategy: NOT_NULL |
|
||||
#驼峰下划线转换 |
|
||||
column-underline: true |
|
||||
banner: false |
|
||||
#原生配置 |
|
||||
configuration: |
|
||||
map-underscore-to-camel-case: true |
|
||||
cache-enabled: false |
|
||||
call-setters-on-nulls: true |
|
||||
jdbc-type-for-null: 'null' |
|
||||
@ -1,159 +0,0 @@ |
|||||
<?xml version="1.0" encoding="UTF-8"?> |
|
||||
<configuration> |
|
||||
<include resource="org/springframework/boot/logging/logback/base.xml"/> |
|
||||
|
|
||||
<property name="log.path" value="logs/epdc-app"/> |
|
||||
|
|
||||
<!-- 彩色日志格式 --> |
|
||||
<property name="CONSOLE_LOG_PATTERN" |
|
||||
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> |
|
||||
|
|
||||
<!--1. 输出到控制台--> |
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> |
|
||||
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> |
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
|
||||
<level>debug</level> |
|
||||
</filter> |
|
||||
<encoder> |
|
||||
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern> |
|
||||
<!-- 设置字符集 --> |
|
||||
<charset>UTF-8</charset> |
|
||||
</encoder> |
|
||||
</appender> |
|
||||
|
|
||||
<!--2. 输出到文档--> |
|
||||
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> |
|
||||
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|
||||
<!-- 正在记录的日志文档的路径及文档名 --> |
|
||||
<file>${log.path}/debug.log</file> |
|
||||
<!--日志文档输出格式--> |
|
||||
<encoder> |
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|
||||
<charset>UTF-8</charset> <!-- 设置字符集 --> |
|
||||
</encoder> |
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|
||||
<!-- 日志归档 --> |
|
||||
<fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
|
||||
<maxFileSize>100MB</maxFileSize> |
|
||||
</timeBasedFileNamingAndTriggeringPolicy> |
|
||||
<!--日志文档保留天数--> |
|
||||
<maxHistory>15</maxHistory> |
|
||||
</rollingPolicy> |
|
||||
<!-- 此日志文档只记录debug级别的 --> |
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
|
||||
<level>debug</level> |
|
||||
<onMatch>ACCEPT</onMatch> |
|
||||
<onMismatch>DENY</onMismatch> |
|
||||
</filter> |
|
||||
</appender> |
|
||||
|
|
||||
<!-- 2.2 level为 INFO 日志,时间滚动输出 --> |
|
||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|
||||
<!-- 正在记录的日志文档的路径及文档名 --> |
|
||||
<file>${log.path}/info.log</file> |
|
||||
<!--日志文档输出格式--> |
|
||||
<encoder> |
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|
||||
<charset>UTF-8</charset> |
|
||||
</encoder> |
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|
||||
<!-- 每天日志归档路径以及格式 --> |
|
||||
<fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
|
||||
<maxFileSize>100MB</maxFileSize> |
|
||||
</timeBasedFileNamingAndTriggeringPolicy> |
|
||||
<!--日志文档保留天数--> |
|
||||
<maxHistory>15</maxHistory> |
|
||||
</rollingPolicy> |
|
||||
<!-- 此日志文档只记录info级别的 --> |
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
|
||||
<level>info</level> |
|
||||
<onMatch>ACCEPT</onMatch> |
|
||||
<onMismatch>DENY</onMismatch> |
|
||||
</filter> |
|
||||
</appender> |
|
||||
|
|
||||
<!-- 2.3 level为 WARN 日志,时间滚动输出 --> |
|
||||
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|
||||
<!-- 正在记录的日志文档的路径及文档名 --> |
|
||||
<file>${log.path}/warn.log</file> |
|
||||
<!--日志文档输出格式--> |
|
||||
<encoder> |
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 --> |
|
||||
</encoder> |
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|
||||
<fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
|
||||
<maxFileSize>100MB</maxFileSize> |
|
||||
</timeBasedFileNamingAndTriggeringPolicy> |
|
||||
<!--日志文档保留天数--> |
|
||||
<maxHistory>15</maxHistory> |
|
||||
</rollingPolicy> |
|
||||
<!-- 此日志文档只记录warn级别的 --> |
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
|
||||
<level>warn</level> |
|
||||
<onMatch>ACCEPT</onMatch> |
|
||||
<onMismatch>DENY</onMismatch> |
|
||||
</filter> |
|
||||
</appender> |
|
||||
|
|
||||
<!-- 2.4 level为 ERROR 日志,时间滚动输出 --> |
|
||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|
||||
<!-- 正在记录的日志文档的路径及文档名 --> |
|
||||
<file>${log.path}/error.log</file> |
|
||||
<!--日志文档输出格式--> |
|
||||
<encoder> |
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 --> |
|
||||
</encoder> |
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|
||||
<fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
|
||||
<maxFileSize>100MB</maxFileSize> |
|
||||
</timeBasedFileNamingAndTriggeringPolicy> |
|
||||
<!--日志文档保留天数--> |
|
||||
<maxHistory>15</maxHistory> |
|
||||
</rollingPolicy> |
|
||||
<!-- 此日志文档只记录ERROR级别的 --> |
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
|
||||
<level>ERROR</level> |
|
||||
<onMatch>ACCEPT</onMatch> |
|
||||
<onMismatch>DENY</onMismatch> |
|
||||
</filter> |
|
||||
</appender> |
|
||||
|
|
||||
<!-- 开发、测试环境 --> |
|
||||
<springProfile name="dev,test"> |
|
||||
<logger name="org.springframework.web" level="INFO"/> |
|
||||
<logger name="org.springboot.sample" level="INFO"/> |
|
||||
<logger name="com.elink.esua.epdc" level="INFO"/> |
|
||||
<logger name="com.elink.esua.epdc.dao" level="DEBUG"/> |
|
||||
<root level="INFO"> |
|
||||
<appender-ref ref="DEBUG_FILE"/> |
|
||||
<appender-ref ref="INFO_FILE"/> |
|
||||
<appender-ref ref="WARN_FILE"/> |
|
||||
<appender-ref ref="ERROR_FILE"/> |
|
||||
</root> |
|
||||
</springProfile> |
|
||||
|
|
||||
<!-- 生产环境 --> |
|
||||
<springProfile name="prod"> |
|
||||
<logger name="org.springframework.web" level="ERROR"/> |
|
||||
<logger name="org.springboot.sample" level="ERROR"/> |
|
||||
<logger name="com.elink.esua.epdc" level="ERROR"/> |
|
||||
<root level="ERROR"> |
|
||||
<appender-ref ref="CONSOLE"/> |
|
||||
<appender-ref ref="DEBUG_FILE"/> |
|
||||
<appender-ref ref="INFO_FILE"/> |
|
||||
<appender-ref ref="WARN_FILE"/> |
|
||||
<appender-ref ref="ERROR_FILE"/> |
|
||||
</root> |
|
||||
</springProfile> |
|
||||
|
|
||||
</configuration> |
|
||||
@ -1,21 +0,0 @@ |
|||||
registry { |
|
||||
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa |
|
||||
type = "nacos" |
|
||||
|
|
||||
nacos { |
|
||||
serverAddr = "47.104.224.45" |
|
||||
namespace = "public" |
|
||||
cluster = "default" |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
config { |
|
||||
# file、nacos 、apollo、zk、consul、etcd3 |
|
||||
type = "nacos" |
|
||||
|
|
||||
nacos { |
|
||||
serverAddr = "47.104.224.45" |
|
||||
namespace = "public" |
|
||||
cluster = "default" |
|
||||
} |
|
||||
} |
|
||||
@ -1,20 +0,0 @@ |
|||||
<?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"> |
|
||||
<parent> |
|
||||
<artifactId>epdc-module</artifactId> |
|
||||
<groupId>com.esua.epdc</groupId> |
|
||||
<version>1.0.0</version> |
|
||||
</parent> |
|
||||
<modelVersion>4.0.0</modelVersion> |
|
||||
|
|
||||
<artifactId>epdc-app</artifactId> |
|
||||
<packaging>pom</packaging> |
|
||||
<modules> |
|
||||
<module>epdc-app-client</module> |
|
||||
<module>epdc-app-server</module> |
|
||||
</modules> |
|
||||
|
|
||||
|
|
||||
</project> |
|
||||
Loading…
Reference in new issue