Eric 1 year ago
parent
commit
581335e7ed
37 changed files with 2011 additions and 111 deletions
  1. 10 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java
  2. 99 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxConfigInfo.java
  3. 55 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxTemplateConfig.java
  4. 63 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxTemplateMessage.java
  5. 4 1
      cooleshow-auth/auth-server/pom.xml
  6. 14 10
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebSecurityConfig.java
  7. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java
  8. 150 81
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  9. 7 8
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  10. 27 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxConfigInfoMapper.java
  11. 27 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxTemplateConfigMapper.java
  12. 27 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxTemplateMessageMapper.java
  13. 63 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxConfigInfoWrapper.java
  14. 63 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxTemplateConfigWrapper.java
  15. 63 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxTemplateMessageWrapper.java
  16. 76 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/enums/ELoginType.java
  17. 50 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/MWxMpService.java
  18. 43 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/WxCacheService.java
  19. 113 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/domain/WxConfigStorageWrapper.java
  20. 25 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/domain/WxContentWrapper.java
  21. 51 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/handler/WxMessageRouteEvent.java
  22. 292 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/impl/MWxMpServiceImpl.java
  23. 115 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/impl/WxCacheServiceImpl.java
  24. 9 4
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java
  25. 67 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxConfigInfoService.java
  26. 43 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxTemplateConfigService.java
  27. 43 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxTemplateMessageService.java
  28. 13 5
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  29. 145 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxConfigInfoServiceImpl.java
  30. 65 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxTemplateConfigServiceImpl.java
  31. 65 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxTemplateMessageServiceImpl.java
  32. 1 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  33. 20 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  34. 36 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxConfigInfoMapper.xml
  35. 25 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxTemplateConfigMapper.xml
  36. 27 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxTemplateMessageMapper.xml
  37. 12 2
      pom.xml

+ 10 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java

@@ -20,6 +20,8 @@ public class LoginEntity {
     private String qrCode;
     //关联帐号授权码
     private String authToken;
+    // 登录类型
+    private String loginType;
     
     public Boolean getIsSurportRegister() {
 		return isSurportRegister;
@@ -92,4 +94,12 @@ public class LoginEntity {
     public void setAuthToken(String authToken) {
         this.authToken = authToken;
     }
+
+    public String getLoginType() {
+        return loginType;
+    }
+
+    public void setLoginType(String loginType) {
+        this.loginType = loginType;
+    }
 }

+ 99 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxConfigInfo.java

@@ -0,0 +1,99 @@
+package com.yonge.cooleshow.auth.api.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 微信配置信息
+ * 2023-02-01 14:21:57
+ */
+@Data
+@ApiModel(" WxConfigInfo-微信配置信息")
+@TableName("wx_config_info")
+public class WxConfigInfo implements Serializable {
+
+    @ApiModelProperty("主键标识")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty("学校ID")
+	@TableField(value = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty("公众号名称")
+	@TableField(value = "mp_name")
+    private String mpName;
+
+    @ApiModelProperty("公众号ID")
+	@TableField(value = "appid")
+    private String appid;
+
+    @ApiModelProperty("接入密钥")
+	@TableField(value = "secret")
+    private String secret;
+
+    @ApiModelProperty("消息密钥")
+	@TableField(value = "token")
+    private String token;
+
+    @ApiModelProperty("加密模式密钥")
+	@TableField(value = "aeskey")
+    private String aeskey;
+
+    @ApiModelProperty("关注公众号提示信息")
+	@TableField(value = "content")
+    private String content;
+
+    @ApiModelProperty("商户ID")
+	@TableField(value = "merchant_id")
+    private String merchantId;
+
+    @ApiModelProperty("商户密钥")
+	@TableField(value = "merchant_key")
+    private String merchantKey;
+
+    @ApiModelProperty("微信帐单回调")
+	@TableField(value = "notify_url")
+    private String notifyUrl;
+
+    @ApiModelProperty("交易类型")
+	@TableField(value = "trade_type")
+    private String tradeType;
+
+    @ApiModelProperty("签名类型")
+	@TableField(value = "sign_type")
+    private String signType;
+
+    @ApiModelProperty("关注跳转地址")
+	@TableField(value = "subscribe_url")
+    private String subscribeUrl;
+
+    @ApiModelProperty("关联公众号")
+	@TableField(value = "mp_app_id")
+    private String mpAppId;
+
+    @ApiModelProperty("公众号类型")
+	@TableField(value = "mp_type")
+    private Integer mpType;
+
+    @ApiModelProperty("全局标识")
+	@TableField(value = "is_global")
+    private Boolean isGlobal;
+
+    @ApiModelProperty("状态")
+	@TableField(value = "status")
+    private Boolean status;
+
+    @ApiModelProperty("创建时间")
+	@TableField(value = "create_time")
+    private Date createTime;
+
+}

+ 55 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxTemplateConfig.java

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.auth.api.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 微信模板配置
+ * 2023-02-01 14:21:57
+ */
+@Data
+@ApiModel(" WxTemplateConfig-微信模板配置")
+@TableName("wx_template_config")
+public class WxTemplateConfig implements Serializable {
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty("微信公众号")
+	@TableField(value = "appid")
+    private String appid;
+
+    @ApiModelProperty("消息指令")
+	@TableField(value = "command")
+    private String command;
+
+    @ApiModelProperty("微信模板id")
+	@TableField(value = "wx_template_id")
+    private String wxTemplateId;
+
+    @ApiModelProperty("模板消息地址")
+	@TableField(value = "url")
+    private String url;
+
+    @ApiModelProperty("描述")
+	@TableField(value = "description")
+    private String description;
+
+    @ApiModelProperty("状态")
+	@TableField(value = "status")
+    private Boolean status;
+
+    @ApiModelProperty("创建时间")
+	@TableField(value = "create_time")
+    private Date createTime;
+
+}

+ 63 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/WxTemplateMessage.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.auth.api.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 微信模板消息内容
+ * 2023-02-01 14:21:57
+ */
+@Data
+@ApiModel(" WxTemplateMessage-微信模板消息内容")
+@TableName("wx_template_message")
+public class WxTemplateMessage implements Serializable {
+
+    @ApiModelProperty("主键列")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty("应用标识")
+	@TableField(value = "appid")
+    private String appid;
+
+    @ApiModelProperty("指令")
+	@TableField(value = "command")
+    private String command;
+
+    @ApiModelProperty("内容")
+	@TableField(value = "content")
+    private String content;
+
+    @ApiModelProperty("标题")
+	@TableField(value = "title")
+    private String title;
+
+    @ApiModelProperty("版本")
+	@TableField(value = "version")
+    private Integer version;
+
+    @ApiModelProperty("类型WECHAT;APP")
+	@TableField(value = "type")
+    private String type;
+
+    @ApiModelProperty("描述")
+	@TableField(value = "description")
+    private String description;
+
+    @ApiModelProperty("状态")
+	@TableField(value = "status")
+    private Boolean status;
+
+    @ApiModelProperty("创建时间")
+	@TableField(value = "create_time")
+    private Date createTime;
+
+}

+ 4 - 1
cooleshow-auth/auth-server/pom.xml

@@ -8,7 +8,6 @@
         <artifactId>cooleshow-auth</artifactId>
         <version>1.0</version>
     </parent>
-    <groupId>com.yonge.cooleshow</groupId>
     <artifactId>auth-server</artifactId>
     <version>1.0</version>
     <name>auth-server</name>
@@ -23,6 +22,10 @@
             <artifactId>microsvc-config-jwt</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-wechat</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-jwt</artifactId>
             <version>1.0.9.RELEASE</version>

+ 14 - 10
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebSecurityConfig.java

@@ -1,5 +1,15 @@
 package com.yonge.cooleshow.auth.config;
 
+import com.yonge.cooleshow.auth.core.filter.PhoneLoginAuthenticationFilter;
+import com.yonge.cooleshow.auth.core.filter.UsernameAuthenticationFilter;
+import com.yonge.cooleshow.auth.core.handler.BaseAuthenticationFailureEvenHandler;
+import com.yonge.cooleshow.auth.core.handler.BaseAuthenticationSuccessEventHandler;
+import com.yonge.cooleshow.auth.core.provider.PhoneAuthenticationProvider;
+import com.yonge.cooleshow.auth.core.provider.service.DefaultUserDetailsService;
+import com.yonge.cooleshow.auth.middleware.wechat.WxCacheService;
+import com.yonge.cooleshow.auth.service.SysUserDeviceService;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -15,16 +25,6 @@ import org.springframework.security.crypto.factory.PasswordEncoderFactories;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
-import com.yonge.cooleshow.auth.core.filter.PhoneLoginAuthenticationFilter;
-import com.yonge.cooleshow.auth.core.filter.UsernameAuthenticationFilter;
-import com.yonge.cooleshow.auth.core.handler.BaseAuthenticationFailureEvenHandler;
-import com.yonge.cooleshow.auth.core.handler.BaseAuthenticationSuccessEventHandler;
-import com.yonge.cooleshow.auth.core.provider.PhoneAuthenticationProvider;
-import com.yonge.cooleshow.auth.core.provider.service.DefaultUserDetailsService;
-import com.yonge.cooleshow.auth.service.SysUserDeviceService;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.service.IdGeneratorService;
-
 @Configuration
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)//会拦截注解了@PreAuthrize注解的配置.
@@ -48,6 +48,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 	@Autowired
 	private SysUserDeviceService sysUserDeviceService;
 
+	@Autowired
+	private WxCacheService wxCacheService;
+
 	@Override
 	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 		auth.authenticationProvider(daoAuthenticationProvider());
@@ -110,6 +113,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
         provider.setSmsCodeService(smsCodeService);
         provider.setSysUserService(sysUserService);
         provider.setSysUserDeviceService(sysUserDeviceService);
+		provider.setWxCacheService(wxCacheService);
 		// 禁止隐藏用户未找到异常
 		provider.setHideUserNotFoundExceptions(false);
         return provider;

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -26,6 +26,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 	private static final String LOGIN_USER_TYPE = "loginUserType";
 	private static final String QR_CODE = "qrCode";
 	private static final String AUTH_TOKEN = "token";
+	private static final String LOGIN_TYPE = "loginType";
 
 	private static final String DEVICE_NUM = "deviceNum";
 
@@ -51,6 +52,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		String loginUserType = obtainParameter(request, LOGIN_USER_TYPE);
 		String qrCode = obtainParameter(request, QR_CODE);
 		String authToken = obtainParameter(request, AUTH_TOKEN);
+		String loginType = obtainParameter(request, LOGIN_TYPE);
 
 		String clientId = request.getParameter(clientIdParameter).toUpperCase();
 
@@ -71,6 +73,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		loginEntity.setDeviceNum(deviceNum);
 		loginEntity.setQrCode(qrCode);
 		loginEntity.setAuthToken(authToken);
+		loginEntity.setLoginType(loginType);
 
 		authRequest = new PhoneAuthenticationToken(SecurityConstants.PHONE_PRINCIPAL_PREFIX + principal, loginEntity);
 

+ 150 - 81
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -1,12 +1,19 @@
 package com.yonge.cooleshow.auth.core.provider;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
+import com.microsvc.toolkit.middleware.wechat.WxServiceManager;
 import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
 import com.yonge.cooleshow.auth.api.entity.LoginEntity;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
+import com.yonge.cooleshow.auth.enums.ELoginType;
+import com.yonge.cooleshow.auth.middleware.wechat.WxCacheService;
 import com.yonge.cooleshow.auth.service.SysUserDeviceService;
 import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.security.SecurityConstants;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.security.interfaces.RSAPublicKey;
 import java.util.Date;
 import java.util.Objects;
+
 @Slf4j
 public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider {
 
@@ -38,6 +46,8 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
     private SysUserDeviceService sysUserDeviceService;
 
+    private WxCacheService wxCacheService;
+
     @Override
     protected void additionalAuthenticationChecks(UserDetails userDetails, Authentication authentication) throws AuthenticationException {
         if (authentication.getCredentials() == null) {
@@ -59,111 +69,166 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
         String qrCode = loginEntity.getQrCode();
         // 授权Token登录
         String authToken = loginEntity.getAuthToken();
-        if (StringUtils.isNotEmpty(qrCode)) {
-            // 二维码验证
-            boolean b = sysUserService.verifyQrCode(phone, qrCode);
-            if (!b) {
-                throw new BadCredentialsException("二维码校验失败");
+        // 用户登陆方式
+        ELoginType loginType = ELoginType.get(loginEntity.getLoginType());
+
+        if (ELoginType.WECHAT_MA == loginType) {
+            // 小程序登陆
+            // 根据小程序code获取openId;查询用户是否存在
+            // 查询配置信息, keyword =>小程序apppid
+            WxMaService wxMaService = WxServiceManager.getInstance().getWxMaService(phone, wxCacheService);
+            if (wxMaService == null) {
+                log.warn("genRequestAuthorityTokenInfo WX_APPID, appid={}, jscode={}", phone, smsCode);
+                throw new BadCredentialsException("小程序授权失败,请联系管理员");
             }
-        } else if (StringUtils.isNotEmpty(authToken)) {
-            // 授权authToken登录
+
             try {
-                RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
-                Jwt jwt = JwtHelper.decodeAndVerify(authToken, new RsaVerifier(rsaPublicKey));
+                // 校验请求jscode的合法
+                WxMaJscode2SessionResult sessionret = wxMaService.getUserService().getSessionInfo(smsCode);
+
+                if (StringUtils.isAnyBlank(sessionret.getOpenid(), sessionret.getSessionKey())) {
+                    log.warn("genRequestAuthorityTokenInfo JSCODE, ret={}", JSON.toJSONString(sessionret));
+                    throw new BadCredentialsException("小程序授权失败,请重新授权");
+                }
+
+                // 用户openid
+                String openid = sessionret.getOpenid();
+                // 用户关联ID
+                // String unionid = sessionret.getUnionid();
+
+                // 根据用户授权openid,查询机构员工绑定信息
+                SysUser sysUser = sysUserService.getSysUserByOpenId(openid);
+                if (Objects.isNull(sysUser)) {
+                    throw new BizException("用户不存在");
+                }
+
+                // 重置登陆账号信息
+                username = SecurityConstants.PHONE_PRINCIPAL_PREFIX + sysUser.getPhone();
+
+                String clientId = loginEntity.getClientId();
+                String deviceNum = loginEntity.getDeviceNum();
 
-                //获取jwt原始内容
-                String claims = jwt.getClaims();
-                if (StringUtils.isEmpty(claims)) {
-                    throw new BizException("三方授权校验失败");
+                // 绑定设备
+                if (StringUtils.isNotBlank(deviceNum)) {
+                    sysUserDeviceService.bindDevice(clientId, sysUser.getId(), deviceNum);
                 }
-                log.info("retrieveUser claims={}", claims);
+
             } catch (Exception e) {
-                log.error("retrieveUser authToken={}", authToken, e);
+                log.error("genRequestAuthorityTokenInfo WX_OAUTH2, appid={}, jscode={}", phone, smsCode, e);
+                throw new BadCredentialsException("小程序授权已失效,请重新登陆");
             }
 
         } else {
-            // 验证码验证
-            boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");
-            if (!b) {
-                throw new BadCredentialsException("验证码校验失败");
-            }
-        }
 
-        String clientId = loginEntity.getClientId();
-        Boolean isRegister = loginEntity.getIsSurportRegister();
-        String loginUserType = loginEntity.getLoginUserType();
-        String deviceNum = loginEntity.getDeviceNum();
+            // 其他登陆方式
+            if (StringUtils.isNotEmpty(qrCode)) {
+                // 二维码验证
+                boolean b = sysUserService.verifyQrCode(phone, qrCode);
+                if (!b) {
+                    throw new BadCredentialsException("二维码校验失败");
+                }
+            } else if (StringUtils.isNotEmpty(authToken)) {
+                // 授权authToken登录
+                try {
+                    RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+                    Jwt jwt = JwtHelper.decodeAndVerify(authToken, new RsaVerifier(rsaPublicKey));
 
-        SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(phone);
+                    //获取jwt原始内容
+                    String claims = jwt.getClaims();
+                    if (StringUtils.isEmpty(claims)) {
+                        throw new BizException("三方授权校验失败");
+                    }
+                    log.info("retrieveUser claims={}", claims);
+                } catch (Exception e) {
+                    log.error("retrieveUser authToken={}", authToken, e);
+                }
 
-        if (userInfo == null) {
-            if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
-                throw new LockedException("用户不存在");
+            } else {
+                // 验证码验证
+                boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");
+                if (!b) {
+                    throw new BadCredentialsException("验证码校验失败");
+                }
             }
 
-            userInfo = sysUserService.registerUser(loginEntity.getPhone(), clientId, loginUserType);
+            String clientId = loginEntity.getClientId();
+            Boolean isRegister = loginEntity.getIsSurportRegister();
+            String loginUserType = loginEntity.getLoginUserType();
+            String deviceNum = loginEntity.getDeviceNum();
 
-            if (Objects.nonNull(userInfo.getSysUser())) {
-                // 自动添加系统默认IM帐号为好友,并自动发送通知消息
-                sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser(), clientId.toUpperCase());
-            }
+            SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(phone);
 
-            if (StringUtils.isNotBlank(deviceNum)) {
-                sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum);
-            }
-        } else {
-            SysUser user = userInfo.getSysUser();
-            if (user == null) {
-                throw new LockedException("用户不存在");
-            }
-            if (user.getLockFlag() == 1) {
-                throw new LockedException("用户已锁定");
-            }
+            if (userInfo == null) {
+                if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
+                    throw new LockedException("用户不存在");
+                }
 
-            if (StringUtils.isNotBlank(deviceNum)) {
-                sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum);
-            }
-            //登录
-            if (userInfo.getSysUser().getUserType().contains(clientId)){
-                return login(username);
-            }
-            //官网登录
-            if(StringUtils.isNotEmpty(loginUserType) && userInfo.getSysUser().getUserType().contains(loginUserType)){
-                return login(username);
-            }
+                userInfo = sysUserService.registerUser(loginEntity.getPhone(), clientId, loginUserType);
 
-            /**********************************注册*********************************************/
-            //不能注册的
-            if(isRegister == false || StringUtils.equals("SYSTEM", clientId)){
-                throw new LockedException("用户不存在");
-            }
+                if (Objects.nonNull(userInfo.getSysUser())) {
+                    // 自动添加系统默认IM帐号为好友,并自动发送通知消息
+                    sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser(), clientId.toUpperCase());
+                }
 
-            user.setUpdateTime(new Date());
-            if(StringUtils.isNotEmpty(loginUserType)){
-                if (StringUtils.equalsIgnoreCase(loginUserType, "TEACHER")) {
-                    user.setUserType(user.getUserType() + "," + loginUserType);
-                    sysUserService.saveTeacher(user);
-                } else if (StringUtils.equalsIgnoreCase(loginUserType, "STUDENT")) {
-                    user.setUserType(user.getUserType() + "," + loginUserType);
-                    sysUserService.saveStudent(user);
-                }else {
+                if (StringUtils.isNotBlank(deviceNum)) {
+                    sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum);
+                }
+            } else {
+                SysUser user = userInfo.getSysUser();
+                if (user == null) {
                     throw new LockedException("用户不存在");
                 }
-            }else if(StringUtils.isNotEmpty(clientId)){
-                if (StringUtils.equalsIgnoreCase(clientId, "TEACHER")) {
-                    user.setUserType(user.getUserType() + "," + clientId);
-                    sysUserService.saveTeacher(user);
-                } else if (StringUtils.equalsIgnoreCase(clientId, "STUDENT")) {
-                    user.setUserType(user.getUserType() + "," + clientId);
-                    sysUserService.saveStudent(user);
-                } else {
+                if (user.getLockFlag() == 1) {
+                    throw new LockedException("用户已锁定");
+                }
+
+                if (StringUtils.isNotBlank(deviceNum)) {
+                    sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum);
+                }
+                //登录
+                if (userInfo.getSysUser().getUserType().contains(clientId)){
+                    return login(username);
+                }
+                //官网登录
+                if(StringUtils.isNotEmpty(loginUserType) && userInfo.getSysUser().getUserType().contains(loginUserType)){
+                    return login(username);
+                }
+
+                /**********************************注册*********************************************/
+                //不能注册的
+                if(isRegister == false || StringUtils.equals("SYSTEM", clientId)){
+                    throw new LockedException("用户不存在");
+                }
+
+                user.setUpdateTime(new Date());
+                if(StringUtils.isNotEmpty(loginUserType)){
+                    if (StringUtils.equalsIgnoreCase(loginUserType, "TEACHER")) {
+                        user.setUserType(user.getUserType() + "," + loginUserType);
+                        sysUserService.saveTeacher(user);
+                    } else if (StringUtils.equalsIgnoreCase(loginUserType, "STUDENT")) {
+                        user.setUserType(user.getUserType() + "," + loginUserType);
+                        sysUserService.saveStudent(user);
+                    }else {
+                        throw new LockedException("用户不存在");
+                    }
+                }else if(StringUtils.isNotEmpty(clientId)){
+                    if (StringUtils.equalsIgnoreCase(clientId, "TEACHER")) {
+                        user.setUserType(user.getUserType() + "," + clientId);
+                        sysUserService.saveTeacher(user);
+                    } else if (StringUtils.equalsIgnoreCase(clientId, "STUDENT")) {
+                        user.setUserType(user.getUserType() + "," + clientId);
+                        sysUserService.saveStudent(user);
+                    } else {
+                        throw new LockedException("用户不存在");
+                    }
+                }else{
                     throw new LockedException("用户不存在");
                 }
-            }else{
-                throw new LockedException("用户不存在");
+                sysUserService.update(user);
             }
-            sysUserService.update(user);
+
         }
+
         return login(username);
     }
 
@@ -211,4 +276,8 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
     public void setSysUserDeviceService(SysUserDeviceService sysUserDeviceService) {
         this.sysUserDeviceService = sysUserDeviceService;
     }
+
+    public void setWxCacheService(WxCacheService wxCacheService) {
+        this.wxCacheService = wxCacheService;
+    }
 }

+ 7 - 8
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java

@@ -1,19 +1,16 @@
 package com.yonge.cooleshow.auth.dal.dao;
 
-import java.util.List;
-
-import com.yonge.cooleshow.common.enums.SysUserType;
-import io.swagger.models.auth.In;
-import org.apache.ibatis.annotations.Param;
-
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.cooleshow.auth.api.dto.UserSetReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
-import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.cooleshow.common.entity.ImUserModel;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysUserDao extends BaseDAO<Long, SysUser> {
 
@@ -176,4 +173,6 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
     void updateLockStatus(@Param("userId")Long userId, @Param("lockFlag") Integer lockFlag, @Param("sysUserType")  String sysUserType);
 
     Long getTenantByClient(@Param("userId") Long userId, @Param("clientId") String clientId);
+
+    SysUser getSysUserByOpenId(@Param("openId") String openId);
 }

+ 27 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxConfigInfoMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.auth.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.dal.wrapper.WxConfigInfoWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 微信配置信息
+ * 2023-02-01 14:21:57
+ */
+@Repository
+public interface WxConfigInfoMapper extends BaseMapper<WxConfigInfo> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<WxConfigInfoWrapper.WxConfigInfo>
+	 * @param param WxConfigInfoWrapper.WxConfigInfoQuery
+	 * @return List<WxConfigInfoWrapper.WxConfigInfo>
+	 */
+	List<WxConfigInfo> selectPage(@Param("page") IPage<WxConfigInfo> page, @Param("param") WxConfigInfoWrapper.WxConfigInfoQuery param);
+
+}

+ 27 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxTemplateConfigMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.auth.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateConfigWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 微信模板配置
+ * 2023-02-01 14:21:57
+ */
+@Repository
+public interface WxTemplateConfigMapper extends BaseMapper<WxTemplateConfig> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<WxTemplateConfigWrapper.WxTemplateConfig>
+	 * @param param WxTemplateConfigWrapper.WxTemplateConfigQuery
+	 * @return List<WxTemplateConfigWrapper.WxTemplateConfig>
+	 */
+	List<WxTemplateConfig> selectPage(@Param("page") IPage<WxTemplateConfig> page, @Param("param") WxTemplateConfigWrapper.WxTemplateConfigQuery param);
+
+}

+ 27 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/WxTemplateMessageMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.auth.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateMessageWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 微信模板消息内容
+ * 2023-02-01 14:21:57
+ */
+@Repository
+public interface WxTemplateMessageMapper extends BaseMapper<WxTemplateMessage> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<WxTemplateMessageWrapper.WxTemplateMessage>
+	 * @param param WxTemplateMessageWrapper.WxTemplateMessageQuery
+	 * @return List<WxTemplateMessageWrapper.WxTemplateMessage>
+	 */
+	List<WxTemplateMessage> selectPage(@Param("page") IPage<WxTemplateMessage> page, @Param("param") WxTemplateMessageWrapper.WxTemplateMessageQuery param);
+
+}

+ 63 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxConfigInfoWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.auth.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Optional;
+
+/**
+ * 微信配置信息
+ * 2023-02-01 14:21:57
+ */
+@ApiModel(value = "WxConfigInfoWrapper对象", description = "微信配置信息查询对象")
+public class WxConfigInfoWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" WxConfigInfoQuery-微信配置信息")
+    public static class WxConfigInfoQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxConfigInfoQuery from(String json) {
+            return JSON.parseObject(json, WxConfigInfoQuery.class);
+        }
+    }
+
+	@ApiModel(" WxConfigInfo-微信配置信息")
+    public static class WxConfigInfo {
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxConfigInfo from(String json) {
+            return JSON.parseObject(json, WxConfigInfo.class);
+        }
+	}
+
+}

+ 63 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxTemplateConfigWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.auth.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Optional;
+
+/**
+ * 微信模板配置
+ * 2023-02-01 14:21:57
+ */
+@ApiModel(value = "WxTemplateConfigWrapper对象", description = "微信模板配置查询对象")
+public class WxTemplateConfigWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" WxTemplateConfigQuery-微信模板配置")
+    public static class WxTemplateConfigQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxTemplateConfigQuery from(String json) {
+            return JSON.parseObject(json, WxTemplateConfigQuery.class);
+        }
+    }
+
+	@ApiModel(" WxTemplateConfig-微信模板配置")
+    public static class WxTemplateConfig {
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxTemplateConfig from(String json) {
+            return JSON.parseObject(json, WxTemplateConfig.class);
+        }
+	}
+
+}

+ 63 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/wrapper/WxTemplateMessageWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.auth.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Optional;
+
+/**
+ * 微信模板消息内容
+ * 2023-02-01 14:21:57
+ */
+@ApiModel(value = "WxTemplateMessageWrapper对象", description = "微信模板消息内容查询对象")
+public class WxTemplateMessageWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" WxTemplateMessageQuery-微信模板消息内容")
+    public static class WxTemplateMessageQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxTemplateMessageQuery from(String json) {
+            return JSON.parseObject(json, WxTemplateMessageQuery.class);
+        }
+    }
+
+	@ApiModel(" WxTemplateMessage-微信模板消息内容")
+    public static class WxTemplateMessage {
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static WxTemplateMessage from(String json) {
+            return JSON.parseObject(json, WxTemplateMessage.class);
+        }
+	}
+
+}

+ 76 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/enums/ELoginType.java

@@ -0,0 +1,76 @@
+package com.yonge.cooleshow.auth.enums;
+
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 登录方式
+ * Created by Eric.Shang on 2022/11/8.
+ */
+@Getter
+public enum ELoginType implements BaseEnum<String, ELoginType> {
+
+    PASSWORD("用户密码"),
+    CAPTCHA("图形验证码"),
+    SMS("短信验证码"),
+    WECHAT_OPENID("微信公众号"),
+    WECHAT_MA("微信小程序"),
+    ;
+
+    private final String message;
+
+    ELoginType(String message) {
+        this.message = message;
+    }
+
+    /**
+     * 获取枚举类的code值
+     *
+     * @return T
+     */
+    @Override
+    public String getCode() {
+        return this.name();
+    }
+
+    /**
+     * 用户登录方式有效性校验
+     * @param name 登录方式
+     * @return boolean
+     */
+    public static boolean invalid(String name) {
+        if (StringUtils.isNotEmpty(name)) {
+
+            ELoginType[] values = ELoginType.values();
+            for (ELoginType item : values) {
+
+                if (item.name().equals(name.toUpperCase())) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 获取登录方式
+     * @param dataType 登录类型
+     * @return ELoginType
+     */
+    public static ELoginType get(String dataType) {
+
+        if (StringUtils.isNoneBlank(dataType)) {
+
+            for (ELoginType item : ELoginType.values()) {
+
+                if (item.getCode().equals(dataType.toUpperCase())) {
+                    return item;
+                }
+            }
+
+        }
+
+        return PASSWORD;
+    }
+}

+ 50 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/MWxMpService.java

@@ -0,0 +1,50 @@
+package com.yonge.cooleshow.auth.middleware.wechat;
+
+import com.microsvc.toolkit.middleware.wechat.WxMpBaseService;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * Created by Eric.Shang on 2/3/17.
+ */
+public interface MWxMpService extends WxMpBaseService {
+
+    /**
+     * 校验公众号签名
+     * @param appid 公众号标识
+     * @param timestamp 时间戳
+     * @param nonce 随机数
+     * @param signature 签名
+     * @return boolean
+     */
+    boolean checkWxMpSignature(String appid, String timestamp, String nonce, String signature);
+
+    /**
+     * 校验小程序签名
+     * @param appid 公众号标识
+     * @param timestamp 时间戳
+     * @param nonce 随机数
+     * @param signature 签名
+     * @return boolean
+     */
+    boolean checkWxMaSignature(String appid, String timestamp, String nonce, String signature);
+
+    /**
+     * 构造oauth2授权的url连接, 网页授权获取用户基本信息
+     * @param appid 公众号标识
+     * @param scope 授权类型
+     * @param state 状态
+     * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
+     * @return String
+     */
+    String oauth2buildAuthorizationUrl(String appid, String redirectURI, String scope, String state);
+
+    /**
+     * 用code网页授权获取用户基本信息
+     * @param appid 公众号标识
+     * @param code 授权code
+     * @return String
+     * @throws WxErrorException WxErrorException
+     */
+    String getOAuth2OpenId(String appid, String code) throws WxErrorException;
+
+}

+ 43 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/WxCacheService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.auth.middleware.wechat;
+
+import com.microsvc.toolkit.middleware.wechat.MWxCacheService;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+
+/**
+ * Created by Eric.Shang on 4/1/18.
+ */
+public interface WxCacheService extends MWxCacheService {
+
+    /**
+     * 模板消息内容
+     * @param appId 公众号标识
+     * @param cmd 消息类型
+     * @return WxTemplateMessage
+     */
+    WxTemplateMessage findWxTemplateMessageBaseInfo(String appId, String cmd);
+
+    /**
+     * 模板消息配置
+     * @param appId 公众号标识
+     * @param cmd 消息类型
+     * @return WxTemplateConfig
+     */
+    WxTemplateConfig findWxTemplateConfigBaseInfo(String appId, String cmd);
+
+    /**
+     * 查询公众号通知消息内容
+     * @param appId 公众号Id
+     * @return WxConfigInfo
+     */
+    WxConfigInfo findMPSubscribeNotifyMessageBaseInfo(String appId);
+
+    /**
+     * 更新公众号关注状态
+     * @param appId 应用ID
+     * @param openId 来源用户
+     * @param subscribe 订阅状态
+     */
+    void updateMpSubscribeStatusInfo(String appId, String openId, Boolean subscribe);
+}

+ 113 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/domain/WxConfigStorageWrapper.java

@@ -0,0 +1,113 @@
+package com.yonge.cooleshow.auth.middleware.wechat.domain;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.middleware.wechat.handler.WxMessageRouteEvent;
+import lombok.Data;
+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.WxMpConfigStorage;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
+
+import java.io.Serializable;
+
+/**
+ * Created by Eric.Shang on 4/3/17.
+ */
+@Data
+public class WxConfigStorageWrapper implements Serializable {
+
+    // 公众号
+    private WxMpService wxMpService;
+    private WxMpConfigStorage storage;
+    private WxConfigInfo config;
+    private WxMpMessageRouter router;
+
+    public static WxConfigStorageWrapper build() {
+        return new WxConfigStorageWrapper();
+    }
+
+    /*
+    公共号配置
+     */
+    private WxMpConfigStorage wxMpConfigStorage() {
+        // 默认实现方式,基于内存存储
+        WxMpDefaultConfigImpl info = new WxMpDefaultConfigImpl();
+        info.setAppId(getConfig().getAppid());
+        info.setSecret(getConfig().getSecret());
+        info.setAesKey(getConfig().getAeskey());
+        info.setToken(getConfig().getToken());
+
+        return info;
+    }
+
+    public WxConfigStorageWrapper config(String config) {
+
+        this.config(JSON.parseObject(config, WxConfigInfo.class)).setStorage(wxMpConfigStorage());
+
+        WxMpService wxService = new WxMpServiceImpl();
+        wxService.setWxMpConfigStorage(getStorage());
+
+        return this.wxMpService(wxService).router(WxMessageRouteEvent.router(wxService));
+    }
+
+    public WxConfigStorageWrapper config(WxConfigInfo config) {
+        this.config = config;
+        return this;
+    }
+
+    public WxConfigStorageWrapper wxMpService(WxMpService wxMpService) {
+        this.wxMpService = wxMpService;
+        return this;
+    }
+
+    public WxConfigStorageWrapper router(WxMpMessageRouter router) {
+        this.router = router;
+        return this;
+    }
+
+    /*
+    小程序配置
+     */
+    private WxMaService wxMaService;
+    private WxMaConfig maConfig;
+    private WxMaMessageRouter maMessageRouter;
+
+    private WxMaConfig wxMaConfigStorage() {
+        // 小程序默认配置实现, 基于内存存储
+        WxMaDefaultConfigImpl info = new WxMaDefaultConfigImpl();
+        info.setAppid(getConfig().getAppid());
+        info.setSecret(getConfig().getSecret());
+        info.setAesKey(getConfig().getAeskey());
+        info.setToken(getConfig().getToken());
+
+        return info;
+    }
+
+    public WxConfigStorageWrapper maConfig(String config) {
+
+        this.config(JSON.parseObject(config, WxConfigInfo.class)).setMaConfig(wxMaConfigStorage());
+
+        WxMaService maService = new WxMaServiceImpl();
+        maService.setWxMaConfig(getMaConfig());
+
+        return this.wxMaService(maService).maMessageRouter(WxMessageRouteEvent.maRouter(maService));
+    }
+
+
+    public WxConfigStorageWrapper wxMaService(WxMaService wxMaService) {
+        this.wxMaService = wxMaService;
+        return this;
+    }
+
+    public WxConfigStorageWrapper maMessageRouter(WxMaMessageRouter maMessageRouter) {
+        this.maMessageRouter = maMessageRouter;
+        return this;
+    }
+}

+ 25 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/domain/WxContentWrapper.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.auth.middleware.wechat.domain;
+
+import com.alibaba.fastjson.JSONArray;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 微信消息(图文消息,文本消息等)
+ * Created by Eric.Shang on 9/1/18.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxContentWrapper implements Serializable {
+
+    private JSONArray welcome;
+    private String contact;
+
+}

+ 51 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/handler/WxMessageRouteEvent.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.auth.middleware.wechat.handler;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
+import com.microsvc.toolkit.middleware.wechat.handler.ContactUSHandler;
+import com.microsvc.toolkit.middleware.wechat.handler.LocationHandler;
+import com.microsvc.toolkit.middleware.wechat.handler.NullHandler;
+import com.microsvc.toolkit.middleware.wechat.handler.ScanHandler;
+import com.microsvc.toolkit.middleware.wechat.handler.SubscribeHandler;
+import com.microsvc.toolkit.middleware.wechat.handler.UnsubscribeHandler;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.api.WxMpMessageRouter;
+import me.chanjar.weixin.mp.api.WxMpService;
+
+/**
+ * 微信消息路由配置
+ * Created by Eric.Shang on 6/3/17.
+ */
+public final class WxMessageRouteEvent {
+
+    // 联系我们事件配置
+    private static final String EVENT_KEY_CONTACT_US = "WX_CONTACT_US";
+
+    private WxMessageRouteEvent() {
+    }
+
+    /**
+     * 微信消息路由处理中心
+     * @param wxMpService 公众号实例
+     * @return WxMpMessageRouter
+     */
+    public static WxMpMessageRouter router(WxMpService wxMpService) {
+        return new WxMpMessageRouter(wxMpService)
+                .rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SCAN).handler(new ScanHandler()).end()
+                .rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SUBSCRIBE).handler(new SubscribeHandler()).end()
+                .rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.UNSUBSCRIBE).handler(new UnsubscribeHandler()).end()
+                .rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.LOCATION).handler(new LocationHandler()).end()
+                .rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(new LocationHandler()).end()
+                .rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.CLICK).eventKey(EVENT_KEY_CONTACT_US).handler(new ContactUSHandler()).end()
+                .rule().async(false).handler(new NullHandler()).end();
+    }
+
+    /**
+     * 小程序消息路由处理中心
+     * @param wxMaService wxMaService
+     * @return WxMaMessageRouter
+     */
+    public static WxMaMessageRouter maRouter(WxMaService wxMaService) {
+        return new WxMaMessageRouter(wxMaService).rule().end();
+    }
+}

+ 292 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/impl/MWxMpServiceImpl.java

@@ -0,0 +1,292 @@
+package com.yonge.cooleshow.auth.middleware.wechat.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaMessage;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Maps;
+import com.microsvc.toolkit.common.tools.ThreadPool;
+import com.microsvc.toolkit.middleware.wechat.WxServiceManager;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.middleware.wechat.MWxMpService;
+import com.yonge.cooleshow.auth.middleware.wechat.WxCacheService;
+import com.yonge.cooleshow.auth.middleware.wechat.domain.WxConfigStorageWrapper;
+import com.yonge.cooleshow.auth.middleware.wechat.domain.WxContentWrapper;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+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.WxMpXmlOutNewsMessage;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import me.chanjar.weixin.mp.config.WxMpConfigStorage;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * 公众号事件消息通知
+ * Created by Eric.Shang on 2/3/17.
+ */
+@Slf4j
+@Service
+public class MWxMpServiceImpl implements MWxMpService {
+
+    private final ConcurrentMap<String, WxConfigStorageWrapper> wxMap = Maps.newConcurrentMap();
+
+    @Autowired
+    private WxCacheService wxCacheService;
+
+    /**
+     * 校验公众号签名
+     *
+     * @param appid 公众号标识
+     * @param timestamp 时间戳
+     * @param nonce     随机数
+     * @param signature 签名
+     * @return boolean
+     */
+    @Override
+    public boolean checkWxMpSignature(String appid, String timestamp, String nonce, String signature) {
+        WxMpService wxMpService = WxServiceManager.getInstance().getWxMpService(appid, wxCacheService);
+        if (wxMpService == null) {
+            log.warn("checkWxMpSignature invalid, appid={}, nonce={} signature={}", appid, nonce, signature);
+            return false;
+        }
+        return wxMpService.checkSignature(timestamp, nonce, signature);
+
+    }
+
+    /**
+     * 校验小程序签名
+     *
+     * @param appid 公众号标识
+     * @param timestamp 时间戳
+     * @param nonce     随机数
+     * @param signature 签名
+     * @return boolean
+     */
+    @Override
+    public boolean checkWxMaSignature(String appid, String timestamp, String nonce, String signature) {
+        WxMaService wxMaService = WxServiceManager.getInstance().getWxMaService(appid, wxCacheService);
+        if (wxMaService == null) {
+            log.warn("checkWxMaSignature invalid, appid={}, nonce={} signature={}", appid, nonce, signature);
+            return false;
+        }
+        return wxMaService.checkSignature(timestamp, nonce, signature);
+
+    }
+
+    /**
+     * 构造oauth2授权的url连接, 网页授权获取用户基本信息
+     * @param appid 公众号标识
+     * @param scope 授权类型
+     * @param state 状态
+     * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
+     * @return String
+     */
+    @Override
+    public String oauth2buildAuthorizationUrl(String appid, String redirectURI, String scope, String state) {
+        WxMpService wxMpService = WxServiceManager.getInstance().getWxMpService(appid, wxCacheService);
+        if (wxMpService == null) {
+            log.warn("oauth2buildAuthorizationUrl invalid, appid={}, url={}, scope={}, state={}", appid, redirectURI,
+                    scope, state);
+            return "";
+        }
+        return wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectURI, scope, state);
+
+    }
+
+    /**
+     * 用code网页授权获取用户基本信息
+     *
+     * @param appid 公众号标识
+     * @param code 授权code
+     * @return String
+     * @throws WxErrorException WxErrorException
+     */
+    @Override
+    public String getOAuth2OpenId(String appid, String code) throws WxErrorException {
+        WxMpService wxMpService = WxServiceManager.getInstance().getWxMpService(appid, wxCacheService);
+        if (wxMpService == null) {
+            log.warn("getOAuth2OpenId invalid, appid={}, code={}", appid, code);
+            return "";
+        }
+
+        return wxMpService.getOAuth2Service().getAccessToken(code).getOpenId();
+    }
+
+    /**
+     * 根据appid返回配置实例对象
+     *
+     * @param appid 公众号ID
+     * @return WxMpConfigStorage
+     */
+    @Override
+    public WxMpConfigStorage getWxMpConfigStorage(String appid) {
+
+        // 公众号配置信息
+        return wxMap.get(appid).getStorage();
+    }
+
+    /**
+     * 微信路由事件消息
+     *
+     * @param appId     公众号ID
+     * @param inMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage route(String appId, WxMpXmlMessage inMessage) {
+        if (StringUtils.isEmpty(appId)) {
+            log.warn("route invalid appid={}", appId);
+            return null;
+        }
+        if (!wxMap.containsKey(appId)) {
+            String wxConfig = wxCacheService.findWxConfigBaseInfo(appId);
+            if (StringUtils.isNotEmpty(wxConfig)) {
+                wxMap.put(appId, WxConfigStorageWrapper.build().config(wxConfig));
+            }
+        }
+        return wxMap.get(appId).getRouter().route(inMessage);
+    }
+
+    /**
+     * 关注微信公众号提示信息
+     *
+     * @param wxMpService WxMpService
+     * @param wxMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage wxMpSubscribePromptInfo(final WxMpService wxMpService, final WxMpXmlMessage wxMessage) {
+
+        // 查询关注公众号通知消息
+        String appId = wxMpService.getWxMpConfigStorage().getAppId();
+
+        // 获取用户信息
+        try {
+            final WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxMessage.getFromUser());
+            ThreadPool.getExecutor().submit(() -> {
+
+                // 更新公众号关注状态
+                wxCacheService.updateMpSubscribeStatusInfo(appId, wxMessage.getFromUser(), wxMpUser.getSubscribe());
+            });
+        } catch (WxErrorException e) {
+            log.error("wxMpSubscribePromptInfo openid={}", wxMessage.getFromUser(), e);
+        }
+
+        WxConfigInfo configInfo = wxCacheService.findMPSubscribeNotifyMessageBaseInfo(appId);
+        if (Objects.isNull(configInfo) || StringUtils.isBlank(configInfo.getContent())) {
+            log.warn("wxMpSubscribePromptInfo invalid req, appid={}", appId);
+            return null;
+        }
+        log.debug("wxMpSubscribePromptInfo appid={}, info={}", appId, JSON.toJSONString(configInfo));
+        // 回复图文消息
+        WxContentWrapper wrapper = JSON.parseObject(configInfo.getContent(), WxContentWrapper.class);
+
+        return WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
+                .articles(JSON.parseArray(wrapper.getWelcome().toString(), WxMpXmlOutNewsMessage.Item.class)).build();
+    }
+
+    /**
+     * 修正用户当前位置信息
+     *
+     * @param wxMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage updateUserLocationInfo(WxMpXmlMessage wxMessage) {
+
+        return null;
+    }
+
+    /**
+     * 用户取消关注事件处理
+     *
+     * @param wxMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage wxMpUnsubscribeInfo(WxMpXmlMessage wxMessage) {
+
+        // 公众号取消关注通知
+        wxCacheService.updateMpSubscribeStatusInfo("", wxMessage.getFromUser(), false);
+
+        return null;
+    }
+
+    /**
+     * 微信扫码消息通知
+     *
+     * @param wxMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage wxScanNotifyInfo(WxMpXmlMessage wxMessage) {
+        /*
+        * 扫描带参数二维码事件
+        *
+        * 消息事件类型:
+        * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
+        * */
+
+        return null;
+    }
+
+    /**
+     * 微信点击联系我们
+     *
+     * @param wxMpService WxMpService
+     * @param wxMessage WxMpXmlMessage
+     * @return WxMpXmlOutMessage
+     */
+    @Override
+    public WxMpXmlOutMessage wxClickEventContactUSInfo(WxMpService wxMpService, WxMpXmlMessage wxMessage) {
+        // 查询关注公众号通知消息
+        String appid = wxMpService.getWxMpConfigStorage().getAppId();
+        WxConfigInfo configInfo = wxCacheService.findMPSubscribeNotifyMessageBaseInfo(appid);
+        if (Objects.isNull(configInfo)) {
+            log.warn("wxMpSubscribePromptInfo invalid req, appid={}", appid);
+            return null;
+        }
+        WxContentWrapper wrapper = JSON.parseObject(JSON.toJSONString(configInfo), WxContentWrapper.class);
+        return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
+                .content(wrapper.getContact()).build();
+    }
+
+    /**
+     * 根据appid返回配置实例对象
+     * @param appid 公众号ID
+     * @return WxMpConfigStorage
+     */
+    @Override
+    public WxMaConfig getWxMaConfigStorage(String appid) {
+        // 公众号配置
+        return wxMap.get(appid).getMaConfig();
+    }
+
+    /**
+     * 小程序路由事件消息
+     * @param appid 公众号ID
+     * @param inMessage WxMpXmlMessage
+     */
+    @Override
+    public void maRoute(String appid, WxMaMessage inMessage) {
+        if (StringUtils.isNotEmpty(appid)) {
+            if (!wxMap.containsKey(appid)) {
+                String wxConfig = wxCacheService.findWxConfigBaseInfo(appid);
+                if (StringUtils.isNotEmpty(wxConfig)) {
+                    wxMap.put(appid, WxConfigStorageWrapper.build().config(wxConfig));
+                }
+            }
+            wxMap.get(appid).getMaMessageRouter().route(inMessage);
+        } else {
+            log.warn("route invalid appid={}", appid);
+        }
+    }
+
+}

+ 115 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/middleware/wechat/impl/WxCacheServiceImpl.java

@@ -0,0 +1,115 @@
+package com.yonge.cooleshow.auth.middleware.wechat.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.middleware.wechat.WxCacheService;
+import com.yonge.cooleshow.auth.service.WxConfigInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 微信配置信息
+ * Created by Eric.Shang on 4/1/18.
+ */
+@Slf4j
+@Service
+public class WxCacheServiceImpl implements WxCacheService {
+
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private WxConfigInfoService wxConfigInfoService;
+
+    // 微信相关缓存信息
+    private static final String WX_CONFIG_KEY = "wxcfg:{0}"; // wxcfg:[#appid#]
+
+    /**
+     * 模板消息内容
+     *
+     * @param appId 公众号标识
+     * @param cmd 消息类型
+     * @return WxTemplateMessage
+     */
+    @Override
+    public WxTemplateMessage findWxTemplateMessageBaseInfo(String appId, String cmd) {
+
+        // 公众号模板信息内容
+        return wxConfigInfoService.findWxTemplateMessageByCommand(appId, cmd);
+    }
+
+    /**
+     * 模板消息配置
+     *
+     * @param appId 公众号标识
+     * @param cmd   消息类型
+     * @return WxTemplateConfig
+     */
+    @Override
+    public WxTemplateConfig findWxTemplateConfigBaseInfo(String appId, String cmd) {
+
+        return wxConfigInfoService.findWxTemplateConfigWhen(appId, cmd);
+    }
+
+    /**
+     * 查询公众号配置信息
+     *
+     * @param appId 公众号ID
+     * @return String
+     */
+    @Override
+    public String findWxConfigBaseInfo(String appId) {
+
+        // 缓存微信配置信息
+        String hash = MessageFormat.format(WX_CONFIG_KEY, appId);
+        RBucket<Object> bucket = redissonClient.getBucket(hash);
+        // 缓存数据已失效,重新生成缓存数据
+        if (!bucket.isExists()) {
+            WxConfigInfo config = wxConfigInfoService.findWxConfigInfoByAppId(appId);
+            if (config == null) {
+                log.warn("findWxConfigBaseInfo 公众号配置不存在, appId={}", appId);
+                return "";
+            }
+
+            // 缓存数据, 默认缓存7天
+            bucket.set(JSON.toJSONString(config), 7, TimeUnit.DAYS);
+
+            // 直接返回
+            return JSON.toJSONString(config);
+        }
+
+        return (String) bucket.get();
+    }
+
+    /**
+     * 查询公众号通知消息内容
+     *
+     * @param appId 公众号Id
+     * @return WxConfigInfo
+     */
+    @Override
+    public WxConfigInfo findMPSubscribeNotifyMessageBaseInfo(String appId) {
+
+        // 查询微信公众号配置信息
+        return wxConfigInfoService.findWxConfigInfoByAppId(appId);
+    }
+
+    /**
+     * 更新公众号关注状态
+     *
+     * @param appId     应用ID
+     * @param openId  来源用户
+     * @param subscribe 订阅状态
+     */
+    @Override
+    public void updateMpSubscribeStatusInfo(String appId, String openId, Boolean subscribe) {
+
+    }
+}

+ 9 - 4
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -1,7 +1,5 @@
 package com.yonge.cooleshow.auth.service;
 
-import java.util.List;
-
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
@@ -10,10 +8,10 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
 import com.yonge.cooleshow.auth.enums.EClientType;
 import com.yonge.cooleshow.common.entity.ImUserModel;
-import com.yonge.cooleshow.common.enums.SysUserType;
-import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.toolset.mybatis.service.BaseService;
 
+import java.util.List;
+
 public interface SysUserService extends BaseService<Long, SysUser> {
 
     /**
@@ -214,4 +212,11 @@ public interface SysUserService extends BaseService<Long, SysUser> {
 
     //根据用户类型获取机构编号
     Long getTenantByClient(Long userId, String clientId);
+
+    /**
+     * 根据openId获取用户信息
+     * @param openId 用户openId
+     * @return SysUser
+     */
+    SysUser getSysUserByOpenId(String openId);
 }

+ 67 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxConfigInfoService.java

@@ -0,0 +1,67 @@
+package com.yonge.cooleshow.auth.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.dal.wrapper.WxConfigInfoWrapper;
+
+/**
+ * 微信配置信息
+ * 2023-02-01 14:21:57
+ */
+public interface WxConfigInfoService extends IService<WxConfigInfo>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxConfigInfo
+     */
+	WxConfigInfo detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<WxConfigInfo>
+     * @param query WxConfigInfoWrapper.WxConfigInfoQuery
+     * @return IPage<WxConfigInfo>
+     */
+    IPage<WxConfigInfo> selectPage(IPage<WxConfigInfo> page, WxConfigInfoWrapper.WxConfigInfoQuery query);
+
+    /**
+     * 添加
+     * @param wxConfigInfo WxConfigInfoWrapper.WxConfigInfo
+     * @return Boolean
+     */
+     Boolean add(WxConfigInfoWrapper.WxConfigInfo wxConfigInfo);
+
+    /**
+     * 更新
+     * @param wxConfigInfo WxConfigInfoWrapper.WxConfigInfo
+     * @return Boolean
+     */
+     Boolean update(WxConfigInfoWrapper.WxConfigInfo wxConfigInfo);
+
+    /**
+     * 公众号模板信息内容
+     * @param appId 公众号Id
+     * @param cmd 消息指令
+     * @return WxTemplateMessage
+     */
+    WxTemplateMessage findWxTemplateMessageByCommand(String appId, String cmd);
+
+    /**
+     * 公众号模板消息配置
+     * @param appId 公众号Id
+     * @param cmd 指令
+     * @return WxTemplateConfig
+     */
+    WxTemplateConfig findWxTemplateConfigWhen(String appId, String cmd);
+
+    /**
+     * 公众号配置
+     * @param appId 公众号Id
+     * @return WxConfigInfo
+     */
+    WxConfigInfo findWxConfigInfoByAppId(String appId);
+}

+ 43 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxTemplateConfigService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.auth.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateConfigWrapper;
+
+/**
+ * 微信模板配置
+ * 2023-02-01 14:21:57
+ */
+public interface WxTemplateConfigService extends IService<WxTemplateConfig>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxTemplateConfig
+     */
+	WxTemplateConfig detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<WxTemplateConfig>
+     * @param query WxTemplateConfigWrapper.WxTemplateConfigQuery
+     * @return IPage<WxTemplateConfig>
+     */
+    IPage<WxTemplateConfig> selectPage(IPage<WxTemplateConfig> page, WxTemplateConfigWrapper.WxTemplateConfigQuery query);
+
+    /**
+     * 添加
+     * @param wxTemplateConfig WxTemplateConfigWrapper.WxTemplateConfig
+     * @return Boolean
+     */
+     Boolean add(WxTemplateConfigWrapper.WxTemplateConfig wxTemplateConfig);
+
+    /**
+     * 更新
+     * @param wxTemplateConfig WxTemplateConfigWrapper.WxTemplateConfig
+     * @return Boolean
+     */
+     Boolean update(WxTemplateConfigWrapper.WxTemplateConfig wxTemplateConfig);
+
+}

+ 43 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/WxTemplateMessageService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.auth.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateMessageWrapper;
+
+/**
+ * 微信模板消息内容
+ * 2023-02-01 14:21:57
+ */
+public interface WxTemplateMessageService extends IService<WxTemplateMessage>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxTemplateMessage
+     */
+	WxTemplateMessage detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<WxTemplateMessage>
+     * @param query WxTemplateMessageWrapper.WxTemplateMessageQuery
+     * @return IPage<WxTemplateMessage>
+     */
+    IPage<WxTemplateMessage> selectPage(IPage<WxTemplateMessage> page, WxTemplateMessageWrapper.WxTemplateMessageQuery query);
+
+    /**
+     * 添加
+     * @param wxTemplateMessage WxTemplateMessageWrapper.WxTemplateMessage
+     * @return Boolean
+     */
+     Boolean add(WxTemplateMessageWrapper.WxTemplateMessage wxTemplateMessage);
+
+    /**
+     * 更新
+     * @param wxTemplateMessage WxTemplateMessageWrapper.WxTemplateMessage
+     * @return Boolean
+     */
+     Boolean update(WxTemplateMessageWrapper.WxTemplateMessage wxTemplateMessage);
+
+}

+ 13 - 5
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -3,7 +3,6 @@ package com.yonge.cooleshow.auth.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
-import com.yonge.cooleshow.api.feign.TeacherFeignService;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.auth.api.dto.QRLoginDto;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
@@ -69,8 +68,6 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     private AdminFeignService adminFeignService;
     @Autowired
     private CustomerServiceConfig customerServiceConfig;
-    @Autowired
-    private TeacherFeignService teacherFeignService;
 
     @Override
     public BaseDAO<Long, SysUser> getDAO() {
@@ -120,12 +117,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         userInfo.setSysUser(sysUser);
 
         List<String> roleCodeList = sysUserRoleService.queryRoleCodeListByUserId(sysUser.getId());
-        userInfo.setRoles(roleCodeList.toArray(new String[roleCodeList.size()]));
+        userInfo.setRoles(roleCodeList.toArray(new String[0]));
 
         List<Long> roleIdList = sysUserRoleService.queryRoleIdListByUserId(sysUser.getId());
         List<String> permissionList = sysRoleMenuService.queryPermissionsByRoleIdList(roleIdList);
 
-        userInfo.setPermissions(permissionList.toArray(new String[permissionList.size()]));
+        userInfo.setPermissions(permissionList.toArray(new String[0]));
 
         return userInfo;
     }
@@ -410,4 +407,15 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         // 查询用户机构信息,若没有则返回-1
         return Optional.ofNullable(sysUserDao.getTenantByClient(userId, clientId)).orElse(-1L);
     }
+
+    /**
+     * 根据openId获取用户信息
+     *
+     * @param openId 用户openId
+     * @return SysUser
+     */
+    @Override
+    public SysUser getSysUserByOpenId(String openId) {
+        return null;
+    }
 }

+ 145 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxConfigInfoServiceImpl.java

@@ -0,0 +1,145 @@
+package com.yonge.cooleshow.auth.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.dal.dao.WxConfigInfoMapper;
+import com.yonge.cooleshow.auth.dal.wrapper.WxConfigInfoWrapper;
+import com.yonge.cooleshow.auth.service.WxConfigInfoService;
+import com.yonge.cooleshow.auth.service.WxTemplateConfigService;
+import com.yonge.cooleshow.auth.service.WxTemplateMessageService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 微信配置信息
+ * 2023-02-01 14:21:57
+ */
+@Slf4j
+@Service
+public class WxConfigInfoServiceImpl extends ServiceImpl<WxConfigInfoMapper, WxConfigInfo> implements WxConfigInfoService {
+
+    @Autowired
+    private WxTemplateConfigService wxTemplateConfigService;
+    @Autowired
+    private WxTemplateMessageService wxTemplateMessageService;
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxConfigInfo
+     */
+	@Override
+    public WxConfigInfo detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<WxConfigInfo>
+     * @param query WxConfigInfoWrapper.WxConfigInfoQuery
+     * @return IPage<WxConfigInfo>
+     */
+    @Override
+    public IPage<WxConfigInfo> selectPage(IPage<WxConfigInfo> page, WxConfigInfoWrapper.WxConfigInfoQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param wxConfigInfo WxConfigInfoWrapper.WxConfigInfo
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(WxConfigInfoWrapper.WxConfigInfo wxConfigInfo) {
+
+        return this.save(JSON.parseObject(wxConfigInfo.jsonString(), WxConfigInfo.class));
+    }
+
+    /**
+     * 更新
+     * @param wxConfigInfo WxConfigInfoWrapper.WxConfigInfo
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(WxConfigInfoWrapper.WxConfigInfo wxConfigInfo){
+
+        return this.updateById(JSON.parseObject(wxConfigInfo.jsonString(), WxConfigInfo.class));
+    }
+
+    /**
+     * 公众号模板信息内容
+     *
+     * @param appId 公众号Id
+     * @param cmd   消息指令
+     * @return WxTemplateMessage
+     */
+    @Override
+    public WxTemplateMessage findWxTemplateMessageByCommand(String appId, String cmd) {
+
+        List<WxTemplateMessage> records = wxTemplateMessageService.lambdaQuery()
+            .eq(WxTemplateMessage::getAppid, appId)
+            .eq(WxTemplateMessage::getCommand, cmd)
+            .eq(WxTemplateMessage::getStatus, true)
+            .list();
+
+        if (CollectionUtils.isEmpty(records)) {
+            return null;
+        }
+
+        return records.get(0);
+    }
+
+    /**
+     * 公众号模板消息配置
+     *
+     * @param appId 公众号Id
+     * @param cmd   指令
+     * @return WxTemplateConfig
+     */
+    @Override
+    public WxTemplateConfig findWxTemplateConfigWhen(String appId, String cmd) {
+
+        List<WxTemplateConfig> records = wxTemplateConfigService.lambdaQuery()
+            .eq(WxTemplateConfig::getAppid, appId)
+            .eq(WxTemplateConfig::getCommand, cmd)
+            .eq(WxTemplateConfig::getStatus, true)
+            .list();
+
+        if (CollectionUtils.isEmpty(records)) {
+            return null;
+        }
+
+        return records.get(0);
+    }
+
+    /**
+     * 公众号配置
+     *
+     * @param appId 公众号Id
+     * @return WxConfigInfo
+     */
+    @Override
+    public WxConfigInfo findWxConfigInfoByAppId(String appId) {
+
+        List<WxConfigInfo> records = lambdaQuery()
+            .eq(WxConfigInfo::getAppid, appId)
+            .eq(WxConfigInfo::getStatus, true)
+            .list();
+
+        if (CollectionUtils.isEmpty(records)) {
+            return null;
+        }
+
+        return records.get(0);
+    }
+}

+ 65 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxTemplateConfigServiceImpl.java

@@ -0,0 +1,65 @@
+package com.yonge.cooleshow.auth.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
+import com.yonge.cooleshow.auth.dal.dao.WxTemplateConfigMapper;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateConfigWrapper;
+import com.yonge.cooleshow.auth.service.WxTemplateConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 微信模板配置
+ * 2023-02-01 14:21:57
+ */
+@Slf4j
+@Service
+public class WxTemplateConfigServiceImpl extends ServiceImpl<WxTemplateConfigMapper, WxTemplateConfig> implements WxTemplateConfigService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxTemplateConfig
+     */
+	@Override
+    public WxTemplateConfig detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<WxTemplateConfig>
+     * @param query WxTemplateConfigWrapper.WxTemplateConfigQuery
+     * @return IPage<WxTemplateConfig>
+     */
+    @Override
+    public IPage<WxTemplateConfig> selectPage(IPage<WxTemplateConfig> page, WxTemplateConfigWrapper.WxTemplateConfigQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param wxTemplateConfig WxTemplateConfigWrapper.WxTemplateConfig
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(WxTemplateConfigWrapper.WxTemplateConfig wxTemplateConfig) {
+
+        return this.save(JSON.parseObject(wxTemplateConfig.jsonString(), WxTemplateConfig.class));
+    }
+
+    /**
+     * 更新
+     * @param wxTemplateConfig WxTemplateConfigWrapper.WxTemplateConfig
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(WxTemplateConfigWrapper.WxTemplateConfig wxTemplateConfig){
+
+        return this.updateById(JSON.parseObject(wxTemplateConfig.jsonString(), WxTemplateConfig.class));
+    }
+}

+ 65 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/WxTemplateMessageServiceImpl.java

@@ -0,0 +1,65 @@
+package com.yonge.cooleshow.auth.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
+import com.yonge.cooleshow.auth.dal.dao.WxTemplateMessageMapper;
+import com.yonge.cooleshow.auth.dal.wrapper.WxTemplateMessageWrapper;
+import com.yonge.cooleshow.auth.service.WxTemplateMessageService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 微信模板消息内容
+ * 2023-02-01 14:21:57
+ */
+@Slf4j
+@Service
+public class WxTemplateMessageServiceImpl extends ServiceImpl<WxTemplateMessageMapper, WxTemplateMessage> implements WxTemplateMessageService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return WxTemplateMessage
+     */
+	@Override
+    public WxTemplateMessage detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<WxTemplateMessage>
+     * @param query WxTemplateMessageWrapper.WxTemplateMessageQuery
+     * @return IPage<WxTemplateMessage>
+     */
+    @Override
+    public IPage<WxTemplateMessage> selectPage(IPage<WxTemplateMessage> page, WxTemplateMessageWrapper.WxTemplateMessageQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param wxTemplateMessage WxTemplateMessageWrapper.WxTemplateMessage
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(WxTemplateMessageWrapper.WxTemplateMessage wxTemplateMessage) {
+
+        return this.save(JSON.parseObject(wxTemplateMessage.jsonString(), WxTemplateMessage.class));
+    }
+
+    /**
+     * 更新
+     * @param wxTemplateMessage WxTemplateMessageWrapper.WxTemplateMessage
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(WxTemplateMessageWrapper.WxTemplateMessage wxTemplateMessage){
+
+        return this.updateById(JSON.parseObject(wxTemplateMessage.jsonString(), WxTemplateMessage.class));
+    }
+}

+ 1 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -79,6 +79,7 @@ public class TokenController extends BaseController {
             @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "smsCode", value = "验证码", required = true, dataType = "String"),
             @ApiImplicitParam(name = "isSurportRegister", value = "是否在登录时注册", dataType = "Boolean"),
+            @ApiImplicitParam(name = "loginType", value = "登陆类型", dataType = "String", defaultValue = "PASSWORD"),
             @ApiImplicitParam(name = "loginUserType", value = "登录用户类型 STUDENT TEACHER(官网登录)", dataType = "String")
     })
     public Object smsLogin() {

+ 20 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -335,4 +335,24 @@
         </if>
     </update>
 
+    <select id="getSysUserByOpenId" resultType="com.yonge.cooleshow.auth.api.entity.SysUser">
+        SELECT t1.*
+        FROM sys_user t1 LEFT JOIN
+        <choose>
+            <when test="clientId == 'STUDENT'">
+                student
+            </when>
+            <when test="clientId == 'TEACHER'">
+                teacher
+            </when>
+            <when test="clientId == 'ORGANIZATION'">
+                tenant_staff
+            </when>
+            <otherwise>
+                employee
+            </otherwise>
+        </choose> t2 ON (t1.id_ = t2.user_id_)
+        WHERE t1.del_flag_ = 0 and t2.wx_openid_ = #{openId} LIMIT 1
+    </select>
+
 </mapper>

+ 36 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxConfigInfoMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.auth.dal.dao.WxConfigInfoMapper">
+
+
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id AS id
+        , t.school_id AS schoolId
+        , t.mp_name AS mpName
+        , t.appid AS appid
+        , t.secret AS secret
+        , t.token AS token
+        , t.aeskey AS aeskey
+        , t.content AS content
+        , t.merchant_id AS merchantId
+        , t.merchant_key AS merchantKey
+        , t.notify_url AS notifyUrl
+        , t.trade_type AS tradeType
+        , t.sign_type AS signType
+        , t.subscribe_url AS subscribeUrl
+        , t.mp_app_id AS mpAppId
+        , t.mp_type AS mpType
+        , t.is_global AS isGlobal
+        , t.status AS status
+        , t.create_time AS createTime
+        </sql>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.auth.api.entity.WxConfigInfo">
+		SELECT
+        	<include refid="baseColumns" />
+		FROM wx_config_info t
+	</select>
+
+</mapper>

+ 25 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxTemplateConfigMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.auth.dal.dao.WxTemplateConfigMapper">
+
+
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id AS id
+        , t.appid AS appid
+        , t.command AS command
+        , t.wx_template_id AS wxTemplateId
+        , t.url AS url
+        , t.description AS description
+        , t.status AS status
+        , t.create_time AS createTime
+        </sql>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.auth.api.entity.WxTemplateConfig">
+		SELECT
+        	<include refid="baseColumns" />
+		FROM wx_template_config t
+	</select>
+
+</mapper>

+ 27 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/WxTemplateMessageMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.auth.dal.dao.WxTemplateMessageMapper">
+
+
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id AS id
+        , t.appid AS appid
+        , t.command AS command
+        , t.content AS content
+        , t.title AS title
+        , t.version AS version
+        , t.type AS type
+        , t.description AS description
+        , t.status AS status
+        , t.create_time AS createTime
+        </sql>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.auth.api.entity.WxTemplateMessage">
+		SELECT
+        	<include refid="baseColumns" />
+		FROM wx_template_message t
+	</select>
+
+</mapper>

+ 12 - 2
pom.xml

@@ -27,6 +27,14 @@
 
 	<dependencyManagement>
 		<dependencies>
+
+			<!--统一版本管理-->
+			<!--<dependency>
+				<groupId>org.springframework.security.oauth.boot</groupId>
+				<artifactId>spring-security-oauth2-autoconfigure</artifactId>
+				<version>2.1.0.RELEASE</version>
+			</dependency>-->
+
 			<!--֧��Spring Boot 2.1.X -->
 			<dependency>
 				<groupId>org.springframework.boot</groupId>
@@ -223,8 +231,8 @@
 
 	<repositories>
 		<repository>
-			<id>anigiomaven</id>
-			<name>AnigioMaven</name>
+			<id>dayamaven</id>
+			<name>Daya Maven</name>
 			<url>https://mvn.dayaedu.com/repository/maven-public/</url>
 		</repository>
 		<repository>
@@ -359,6 +367,7 @@
 		</pluginManagement>
 		<plugins>
 			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
 				<version>3.8.0</version>
 				<configuration>
@@ -375,6 +384,7 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.6</version>
 				<configuration>
 					<encoding>UTF-8</encoding>
 					<!-- 过滤后缀为pem、pfx的证书文件 -->