Forráskód Böngészése

新增微信小程序登录验证

Gogs 4 éve
szülő
commit
3d80766bbb
37 módosított fájl, 975 hozzáadás és 110 törlés
  1. 5 4
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java
  2. 24 0
      boman-api/boman-api-wechat/pom.xml
  3. 22 0
      boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java
  4. 11 1
      boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java
  5. 21 0
      boman-api/boman-domain/src/main/java/com.boman.domain/WechatEnum.java
  6. 5 0
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java
  7. 44 53
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java
  8. 26 5
      boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java
  9. 1 0
      boman-api/pom.xml
  10. 5 1
      boman-auth/pom.xml
  11. 43 14
      boman-auth/src/main/java/com/boman/auth/controller/TokenController.java
  12. 17 23
      boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java
  13. 2 0
      boman-common/boman-common-redis/src/main/java/com/boman/common/redis/RedisKey.java
  14. 0 0
      boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java
  15. 6 0
      boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java
  16. 7 8
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java
  17. 3 0
      boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java
  18. 7 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java
  19. 13 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java
  20. 6 1
      boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml
  21. 102 0
      boman-web-core/src/main/java/com/boman/web/core/mapper/JFTaskBusinessMapper.java
  22. 3 0
      boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java
  23. 105 0
      boman-wechat/pom.xml
  24. 33 0
      boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java
  25. 53 0
      boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java
  26. 30 0
      boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java
  27. 14 0
      boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java
  28. 119 0
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java
  29. 92 0
      boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java
  30. 4 0
      boman-wechat/src/main/resources/application.properties
  31. 19 0
      boman-wechat/src/main/resources/bootstrap-prod.yml
  32. 19 0
      boman-wechat/src/main/resources/bootstrap-test.yml
  33. 19 0
      boman-wechat/src/main/resources/bootstrap.yml
  34. 74 0
      boman-wechat/src/main/resources/logback.xml
  35. 4 0
      boman-wechat/src/main/resources/rebel-remote.xml
  36. 16 0
      boman-wechat/src/main/resources/rebel.xml
  37. 1 0
      pom.xml

+ 5 - 4
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java

@@ -1,15 +1,13 @@
 package com.boman.system.api;
 
 import com.boman.domain.SysUser;
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.*;
 import com.boman.domain.constant.ServiceNameConstants;
 import com.boman.domain.dto.R;
 import com.boman.system.api.factory.RemoteUserFallbackFactory;
 import com.boman.system.api.model.LoginUser;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -38,4 +36,7 @@ public interface RemoteUserService
      */
     @PostMapping("/user/listByDeptId")
     List<SysUser> listByDeptId(@RequestBody List<Long> deptIdList);
+
+    @PostMapping("/user/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser);
 }

+ 24 - 0
boman-api/boman-api-wechat/pom.xml

@@ -0,0 +1,24 @@
+<?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>
+        <groupId>com.boman</groupId>
+        <artifactId>boman-api</artifactId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>boman-api-wechat</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-domain</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 22 - 0
boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java

@@ -0,0 +1,22 @@
+package com.boman.wechat.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(contextId = "remoteObjService", value = ServiceNameConstants.WECHAT_SERVICE)
+public interface RemoteWechatService {
+
+    /**
+     * 功能描述: 根据微信登录后获取的code获取用户的授权信息
+     *
+     * @param loginBody 登录信息体
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/wechat/p/c/wechatInfo")
+    AjaxResult getWechatInfo(@RequestBody LoginBody loginBody);
+}

+ 11 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java

@@ -92,6 +92,8 @@ public class SysUser extends BaseEntity
     /** 岗位组 */
     private Long[] postIds;
 
+    private String unionId;
+
     public SysUser()
     {
 
@@ -306,7 +308,15 @@ public class SysUser extends BaseEntity
     {
         this.postIds = postIds;
     }
-    
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 21 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/WechatEnum.java

@@ -0,0 +1,21 @@
+package com.boman.domain;
+
+public enum WechatEnum {
+    /** 用户账号登录 */
+    U("u"),
+    /** 微信授权登录 */
+    W("w");
+
+
+    private String value;
+
+    private WechatEnum(String value)
+    {
+        this.value = value;
+    }
+
+    public String getValue()
+    {
+        return value;
+    }
+}

+ 5 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java

@@ -36,4 +36,9 @@ public class ServiceNameConstants
      * boman-jflow
      */
     public static final String JFLOW_SERVICE = "boman-jflow";
+
+    /**
+     * boman-wechat
+     */
+    public static final String WECHAT_SERVICE = "boman-wechat";
 }

+ 44 - 53
boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java

@@ -1,62 +1,64 @@
 package com.boman.domain.dto;
 
 import java.util.HashMap;
+
 import com.boman.domain.constant.HttpStatus;
 
 /**
  * 操作消息提醒
- * 
+ *
  * @author ruoyi
  */
-public class AjaxResult extends HashMap<String, Object>
-{
+public class AjaxResult extends HashMap<String, Object> {
     private static final long serialVersionUID = 1L;
 
-    /** 状态码 */
+    /**
+     * 状态码
+     */
     public static final String CODE_TAG = "code";
 
-    /** 返回内容 */
+    /**
+     * 返回内容
+     */
     public static final String MSG_TAG = "msg";
 
-    /** 数据对象 */
+    /**
+     * 数据对象
+     */
     public static final String DATA_TAG = "data";
 
     /**
      * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
      */
-    public AjaxResult()
-    {
+    public AjaxResult() {
     }
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      */
-    public AjaxResult(int code, String msg)
-    {
+    public AjaxResult(int code, String msg) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
     }
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      * @param data 数据对象
      */
-    public AjaxResult(int code, String msg, Object data)
-    {
+    public AjaxResult(int code, String msg, Object data) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
-        if (null != data)
-        {
+        if (null != data) {
             super.put(DATA_TAG, data);
         }
     }
-    
+
     /**
      * 方便链式调用
      *
@@ -65,117 +67,106 @@ public class AjaxResult extends HashMap<String, Object>
      * @return
      */
     @Override
-    public AjaxResult put(String key, Object value)
-    {
+    public AjaxResult put(String key, Object value) {
         super.put(key, value);
         return this;
     }
 
     /**
      * 返回成功消息
-     * 
+     *
      * @return 成功消息
      */
-    public static AjaxResult success()
-    {
+    public static AjaxResult success() {
         return AjaxResult.success("操作成功");
     }
 
     /**
      * 返回成功数据
-     * 
+     *
      * @return 成功消息
      */
-    public static AjaxResult success(Object data)
-    {
+    public static AjaxResult success(Object data) {
         return AjaxResult.success("操作成功", data);
     }
 
     /**
      * 返回成功消息
-     * 
+     *
      * @param msg 返回内容
      * @return 成功消息
      */
-    public static AjaxResult success(String msg)
-    {
+    public static AjaxResult success(String msg) {
         return AjaxResult.success(msg, null);
     }
 
     /**
      * 返回成功消息
-     * 
-     * @param msg 返回内容
+     *
+     * @param msg  返回内容
      * @param data 数据对象
      * @return 成功消息
      */
-    public static AjaxResult success(String msg, Object data)
-    {
+    public static AjaxResult success(String msg, Object data) {
         return new AjaxResult(HttpStatus.SUCCESS, msg, data);
     }
 
     /**
      * 返回成功消息
      *
-     * @param msg 返回内容
      * @param data 数据对象
      * @return 成功消息
      */
-    public static AjaxResult successZero( Object data)
-    {
+    public static AjaxResult successZero(Object data) {
         return new AjaxResult(HttpStatus.ZEROSUCCESS, "", data);
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @return
      */
-    public static AjaxResult error()
-    {
+    public static AjaxResult error() {
         return AjaxResult.error("操作失败");
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @param msg 返回内容
      * @return 警告消息
      */
-    public static AjaxResult error(String msg)
-    {
+    public static AjaxResult error(String msg) {
         return AjaxResult.error(msg, null);
     }
 
     /**
      * 返回错误消息
-     * 
-     * @param msg 返回内容
+     *
+     * @param msg  返回内容
      * @param data 数据对象
      * @return 警告消息
      */
-    public static AjaxResult error(String msg, Object data)
-    {
+    public static AjaxResult error(String msg, Object data) {
         return new AjaxResult(HttpStatus.ERROR, msg, data);
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      * @return 警告消息
      */
-    public static AjaxResult error(int code, String msg)
-    {
+    public static AjaxResult error(int code, String msg) {
         return new AjaxResult(code, msg, null);
     }
 
-    public static boolean checkSuccess(AjaxResult ajaxResult){
+    public static boolean checkSuccess(AjaxResult ajaxResult) {
         return null != ajaxResult && HttpStatus.SUCCESS == ((int) ajaxResult.get(CODE_TAG));
     }
 
-    public static boolean checkFail(AjaxResult ajaxResult){
+    public static boolean checkFail(AjaxResult ajaxResult) {
         return !checkSuccess(ajaxResult);
     }
 }

+ 26 - 5
boman-auth/src/main/java/com/boman/auth/form/LoginBody.java → boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java

@@ -1,12 +1,13 @@
-package com.boman.auth.form;
+package com.boman.domain.form;
+
+import com.boman.domain.WechatEnum;
 
 /**
  * 用户登录对象
- * 
+ *
  * @author ruoyi
  */
-public class LoginBody
-{
+public class LoginBody {
     /**
      * 用户名
      */
@@ -17,6 +18,10 @@ public class LoginBody
      */
     private String password;
 
+    private String code;
+
+    private String logintype;
+
     public String getUsername()
     {
         return username;
@@ -36,4 +41,20 @@ public class LoginBody
     {
         this.password = password;
     }
-}
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getLogintype() {
+        return logintype;
+    }
+
+    public void setLogintype(String logintype) {
+        this.logintype = logintype;
+    }
+}

+ 1 - 0
boman-api/pom.xml

@@ -14,6 +14,7 @@
         <module>boman-domain</module>
         <module>boman-api-web-core</module>
         <module>boman-api-jflow</module>
+        <module>boman-api-wechat</module>
     </modules>
 
     <artifactId>boman-api</artifactId>

+ 5 - 1
boman-auth/pom.xml

@@ -64,7 +64,11 @@
             <groupId>com.boman</groupId>
             <artifactId>boman-common-security</artifactId>
         </dependency>
-        
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-wechat</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 	
     <build>

+ 43 - 14
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -2,9 +2,15 @@ package com.boman.auth.controller;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.exception.BaseException;
+import com.boman.domain.SysUser;
+import com.boman.domain.WechatEnum;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.api.RemoteWechatService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import com.boman.auth.form.LoginBody;
 import com.boman.auth.service.SysLoginService;
 import com.boman.domain.dto.R;
 import com.boman.common.core.utils.StringUtils;
@@ -13,34 +19,59 @@ import com.boman.system.api.model.LoginUser;
 
 /**
  * token 控制
- * 
+ *
  * @author ruoyi
  */
 @RestController
 //@CrossOrigin
-public class TokenController
-{
+public class TokenController {
+
     @Autowired
     private TokenService tokenService;
 
     @Autowired
     private SysLoginService sysLoginService;
 
+    @Autowired
+    private RemoteWechatService remoteWechatService;
+
     @PostMapping("login")
-    public R<?> login(@RequestBody LoginBody form)
-    {
+    public R<?> login(@RequestBody LoginBody form) {
+        String unionId = "";
+        // 验证是pc还是小程序
+        if (form.getLogintype() != null && form.getLogintype().equals(WechatEnum.W.getValue())) {
+            AjaxResult result = remoteWechatService.getWechatInfo(form);
+            if ((Integer) result.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException((String) result.get(AjaxResult.MSG_TAG));
+            }
+            JSONObject jsonObject = (JSONObject) result.get(AjaxResult.DATA_TAG);
+            if (jsonObject == null) {
+                throw new BaseException("未获取到微信鉴权相关信息!");
+            }
+            unionId = (String) jsonObject.get("unionid");
+        }
         // 用户登录
         LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
+        // 如果是微信登录并且获取到的用户的unionId不为空
+        if (form.getLogintype() != null
+                && form.getLogintype().equals(WechatEnum.W.getValue())
+                && StringUtils.isNotEmpty(unionId)) {
+            SysUser sysUser = new SysUser();
+            sysUser.setId(userInfo.getUserid());
+            sysUser.setUnionId(unionId);
+            AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
+            if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException("保存小程序唯一标识出错!");
+            }
+        }
         // 获取登录token
         return R.ok(tokenService.createToken(userInfo));
     }
 
     @DeleteMapping("logout")
-    public R<?> logout(HttpServletRequest request)
-    {
+    public R<?> logout(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             String username = loginUser.getUsername();
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
@@ -51,11 +82,9 @@ public class TokenController
     }
 
     @PostMapping("refresh")
-    public R<?> refresh(HttpServletRequest request)
-    {
+    public R<?> refresh(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             // 刷新令牌有效期
             tokenService.refreshToken(loginUser);
             return R.ok();

+ 17 - 23
boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java

@@ -1,5 +1,6 @@
 package com.boman.auth.service;
 
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.boman.domain.constant.Constants;
@@ -16,12 +17,11 @@ import com.boman.system.api.model.LoginUser;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private RemoteLogService remoteLogService;
 
@@ -31,56 +31,47 @@ public class SysLoginService
     /**
      * 登录
      */
-    public LoginUser login(String username, String password)
-    {
+    public LoginUser login(String username, String password) {
         // 用户名或密码为空 错误
-        if (StringUtils.isAnyBlank(username, password))
-        {
+        if (StringUtils.isAnyBlank(username, password)) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
             throw new BaseException("用户/密码必须填写");
         }
         // 密码如果不在指定范围内 错误
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
-                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
-        {
+                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
             throw new BaseException("用户密码不在指定范围");
         }
         // 用户名不在指定范围内 错误
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
-                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
-        {
+                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
             throw new BaseException("用户名不在指定范围");
         }
         // 查询用户信息
         R<LoginUser> userResult = remoteUserService.getUserInfo(username);
 
-        if (R.FAIL == userResult.getCode())
-        {
+        if (R.FAIL == userResult.getCode()) {
             throw new BaseException(userResult.getMsg());
         }
 
-        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
-        {
+        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
             throw new BaseException("登录用户:" + username + " 不存在");
         }
         LoginUser userInfo = userResult.getData();
         SysUser user = userResult.getData().getSysUser();
-        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
-        {
+        if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
 
             throw new BaseException("对不起,您的账号:" + username + " 已被删除");
         }
-        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-        {
+        if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
             throw new BaseException("对不起,您的账号:" + username + " 已停用");
         }
-        if (!SecurityUtils.matchesPassword(password, user.getPassword()))
-        {
+        if (!SecurityUtils.matchesPassword(password, user.getPassword())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户密码错误");
             throw new BaseException("用户不存在/密码错误");
         }
@@ -88,8 +79,11 @@ public class SysLoginService
         return userInfo;
     }
 
-    public void logout(String loginName)
-    {
+    public AjaxResult updateUnionId(SysUser sysUser) {
+        return remoteUserService.updateUnionId(sysUser);
+    }
+
+    public void logout(String loginName) {
         remoteLogService.saveLogininfor(loginName, Constants.LOGOUT, "退出成功");
     }
 }

+ 2 - 0
boman-common/boman-common-redis/src/main/java/com/boman/common/redis/RedisKey.java

@@ -32,4 +32,6 @@ public class RedisKey {
      * 单据的seq
      */
     public static final String BILL_SQE = "BILL:SEQ:";
+
+    public static final String USER_OPPEN_ID_AND_SESSION_KEY_PREFIX = "openId:sessionKey:";
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java


+ 6 - 0
boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java

@@ -36,6 +36,8 @@ public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
 
     private static final String UUID = "uuid";
 
+    private static final String LOGINTYPE = "logintype";
+
     @Override
     public GatewayFilter apply(Object config)
     {
@@ -52,6 +54,10 @@ public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
             {
                 String rspStr = resolveBodyFromRequest(request);
                 JSONObject obj = JSONObject.parseObject(rspStr);
+                String loginType = (String) obj.get(LOGINTYPE);
+                if(StringUtils.isNotEmpty(loginType) && loginType.equals("w")) {
+                    return chain.filter(exchange);
+                }
                 validateCodeService.checkCapcha(obj.getString(CODE), obj.getString(UUID));
             }
             catch (Exception e)

+ 7 - 8
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java

@@ -13,14 +13,7 @@ import com.boman.system.service.*;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.boman.domain.constant.UserConstants;
 import com.boman.domain.dto.R;
@@ -168,6 +161,12 @@ public class SysUserController extends BaseController
         return ajax;
     }
 
+    @Log(title = "修改用户的小程序唯一标识", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser) {
+        return userService.updateUnionId(sysUser);
+    }
+
     /**
      * 根据用户编号获取详细信息
      */

+ 3 - 0
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java

@@ -37,6 +37,9 @@ public interface SysUserMapper
      */
     public SysUser selectUserById(Long id);
 
+    int updateUnionId(SysUser user);
+
+
     /**
      * 新增用户信息
      * 

+ 7 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java

@@ -38,6 +38,13 @@ public interface ISysUserService
      */
     public SysUser selectUserById(Long id);
 
+    /**
+     * 根据id修改用户的unionId(来自微信小程序)
+     * @param sysUser
+     * @return
+     */
+    public AjaxResult updateUnionId(SysUser sysUser);
+
     /**
      * 根据用户ID查询用户所属角色组
      * 

+ 13 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java

@@ -103,6 +103,19 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserById(id);
     }
 
+    @Override
+    public AjaxResult updateUnionId(SysUser user) {
+        try {
+            if(userMapper.updateUnionId(user) > 0) {
+                return AjaxResult.successZero("");
+            }
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "保存异常");
+        }
+
+        return AjaxResult.error(-1, "保存失败");
+    }
+
     /**
      * 查询用户所属角色组
      * 

+ 6 - 1
boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 	
 	<sql id="selectUserVo">
-        select u.id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, 
+        select u.id, u.union_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         d.id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
@@ -132,6 +132,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
+
+	<update id="updateUnionId" parameterType="com.boman.domain.SysUser">
+		update sys_user set union_id = #{unionId} where id = #{id}
+	</update>
+
 	
 	<update id="updateUser" parameterType="com.boman.domain.SysUser">
  		update sys_user

+ 102 - 0
boman-web-core/src/main/java/com/boman/web/core/mapper/JFTaskBusinessMapper.java

@@ -0,0 +1,102 @@
+package com.boman.web.core.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.domain.jflow.ProcessNodeCandidator;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.mysql.cj.util.StringUtils.isNullOrEmpty;
+
+/**
+ * 流程针对业务数据层面接口
+ *
+ *
+ * @author zhong.h
+ */
+@Mapper
+@Component
+public interface JFTaskBusinessMapper {
+    Logger LOGGER = LoggerFactory.getLogger(JFTaskBusinessMapper.class);
+
+    @InsertProvider(type = StandardMapper.SqlProvider.class, method = "insert")
+    int insert(@Param("tableName") String var1, @Param("model") JSONObject var2);
+
+    @UpdateProvider(type = StandardMapper.SqlProvider.class, method = "update")
+    int updateByIdList(@Param("tableName") String tableName, @Param("pkName") String pkName
+            , @Param("idList") List<Long> idList, @Param("model") JSONObject models);
+
+
+    @Select("select * from process_node_candidators t where t.business_code = #{businessCode} and t.module_id = #{moduleId} and t.node_id = #{nodeId}")
+    ProcessNodeCandidator selectData(@Param("businessCode") Long businessCode, @Param("moduleId") Long moduleId, @Param("nodeId") Long nodeId);
+
+    class SqlProvider {
+
+        public String insertList(Map<String, Object> para) {
+            List<JSONObject> dataList = (List<JSONObject>) para.get("dataList");
+            String tableName = (String) para.get("tableName");
+            if (isNullOrEmpty(tableName)) {
+                throw new IllegalArgumentException("tableName 无效");
+            }
+
+            if (ObjectUtils.isEmpty(dataList)) {
+                throw new IllegalArgumentException("需要插入的数据为空");
+            }
+
+            StringBuilder stringBuilder = new StringBuilder();
+            stringBuilder.append("insert into ").append(tableName).append(" ( ");
+            JSONObject keySet = dataList.get(0);
+            stringBuilder.append(String.join(", ", keySet.keySet()));
+            stringBuilder.append(" ) ").append("values ");
+
+            for (JSONObject data : dataList) {
+                StringBuilder values = new StringBuilder();
+                values.append(" ( ");
+                for (Map.Entry<String, Object> entry : data.entrySet()) {
+                    values.append("#{model.").append(entry.getKey()).append("}, ");
+                }
+
+                String beforeLast = StringUtils.substringBeforeLast(values.toString(), ", ");
+                stringBuilder.append(beforeLast).append(" ) ");
+            }
+
+            String sqlStr = stringBuilder.toString();
+            LOGGER.info("批量新增的sql语句为: {} \r\n 新增的数据为: {}", sqlStr, dataList);
+            return sqlStr;
+        }
+
+        public String update(Map<String, Object> para) {
+            String tableName = (String) para.get("tableName");
+            String pkName = (String) para.get("pkName");
+            List<Long> idList = (List<Long>) para.get("idList");
+            JSONObject models = (JSONObject) para.get("model");
+
+            StringBuilder wholeSql = new StringBuilder();
+            wholeSql.append("update ").append(tableName).append(" set ");
+            for (Map.Entry<String, Object> entry : models.entrySet()) {
+                String key = entry.getKey();
+                Object value = entry.getValue();
+                wholeSql.append(key).append(" = ").append(value).append(" , ");
+            }
+
+            wholeSql = new StringBuilder(StringUtils.substringBeforeLast(wholeSql.toString(), ","));
+            wholeSql.append(" where ").append(pkName).append(" in ( ");
+
+            for (int i = 0; i < idList.size(); ++i) {
+                wholeSql.append(String.format("#{idList[%d]}", i));
+                wholeSql.append(",");
+            }
+
+            wholeSql.setCharAt(wholeSql.length() - 1, ')');
+            String sqlStr = wholeSql.toString();
+            LOGGER.info("批量更新的sql语句为: {} \r\n 更改的数据为: {} \r\n idList: {}", sqlStr, models, idList);
+            return sqlStr;
+        }
+    }
+}

+ 3 - 0
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -553,6 +553,9 @@ public class TableServiceCmdService {
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, dto.getTable());
 
         JSONObject jsonObject = selectService.selectById(dto.getTable(), IdUtils.getPkName(genTable.getColumns()), dto.getObjId(), dto.getOther());
+        if(jsonObject == null) {
+            return AjaxResult.error("没有表单数据", jsonObject);
+        }
         List<GenTableColumn> columns = genTable.getColumns();
         JSONArray addcolums = new JSONArray();
         this.addOtherColumn(columns, dto.getOther());

+ 105 - 0
boman-wechat/pom.xml

@@ -0,0 +1,105 @@
+<?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>boman</artifactId>
+        <groupId>com.boman</groupId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>boman-wechat</artifactId>
+
+    <properties>
+
+    </properties>
+
+    <dependencies>
+        <!-- SpringCloud Ailibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- Swagger UI -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.fox.version}</version>
+        </dependency>
+
+        <!-- Mysql Connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common DataSource -->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datasource</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common DataScope-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datascope</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Log-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-log</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Swagger-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-swagger</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
+
+        <!--        远程调用 gen-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-gen</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <!--        远程调用 system-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-system</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>

+ 33 - 0
boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java

@@ -0,0 +1,33 @@
+package com.boman.wechat;
+
+import com.boman.common.security.annotation.EnableCustomConfig;
+import com.boman.common.security.annotation.EnableRyFeignClients;
+import com.boman.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * 微信对接模块
+ *
+ * @author zhong.h
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringCloudApplication
+@ComponentScan(value = "com.boman")
+public class BomanWechatApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BomanWechatApplication.class, args);
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------- boman wechat 模块启动成功------------------------------------");
+        System.out.println("----------------------------------boman wechat 模块启动成功-----------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+    }
+}

+ 53 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java

@@ -0,0 +1,53 @@
+package com.boman.wechat.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WechatProperties {
+
+    @Value("${auth.wechat.sessionHost}")
+    private String host;
+
+    @Value("${auth.wechat.appId}")
+    private String appId;
+
+    @Value("${auth.wechat.secret}")
+    private String secret;
+
+    @Value("${auth.wechat.grantType}")
+    private String grantType;
+
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public String getGrantType() {
+        return grantType;
+    }
+
+    public void setGrantType(String grantType) {
+        this.grantType = grantType;
+    }
+}

+ 30 - 0
boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java

@@ -0,0 +1,30 @@
+package com.boman.wechat.controller;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.service.WechatService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 微信登录验证
+ *
+ * @author zhong.h
+ */
+@RequestMapping("/wechat/p/c")
+@RestController
+public class WechatInfoController {
+
+    @Autowired
+    private WechatService wechatService;
+
+    @ApiOperation(value = "小程序相关信息获取")
+    @RequestMapping(value = "/wechatInfo", method = RequestMethod.POST)
+    public AjaxResult getWechatInfo(@RequestBody LoginBody loginBody) {
+        return wechatService.getWechatInfo(loginBody);
+    }
+}

+ 14 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java

@@ -0,0 +1,14 @@
+package com.boman.wechat.service;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+
+/**
+ * 获取微信信息接口
+ *
+ * @author zhong.h
+ */
+public interface WechatService {
+
+    AjaxResult getWechatInfo(LoginBody loginBody);
+}

+ 119 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java

@@ -0,0 +1,119 @@
+package com.boman.wechat.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.redis.RedisKey;
+import com.boman.common.redis.service.RedisService;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.config.WechatProperties;
+import com.boman.wechat.service.WechatService;
+import com.boman.wechat.utils.HttpClientUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Service
+public class WechatServiceImpl implements WechatService {
+
+    private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
+
+    @Resource
+    private RedisService redisService;
+    @Autowired
+    private WechatProperties properties;
+
+    @Override
+    public AjaxResult getWechatInfo(LoginBody loginBody) {
+        JSONObject infoJsonObject = new JSONObject();
+        String code = loginBody.getCode();
+        // 获取openId && sessionKey
+        String openId = "";
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        String sessionKey = "";
+
+        // logger报错的话,删掉就好,或者替换为自己的日志对象
+        logger.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginBody));
+        JSONObject authInfo = null;
+        try {
+            authInfo = this.getSessionKeyAndOpenId(code);
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "获取信息失败");
+        }
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        if(authInfo == null) {
+            return AjaxResult.error(-1, "未获取到认证");
+        }
+        String errMsg = this.validatWechatInfo(authInfo);
+        if(StringUtils.isNotEmpty(errMsg)) {
+            return AjaxResult.error(-1, errMsg);
+        }
+        // 获取openId && sessionKey
+        openId = authInfo.getString("openid");
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        sessionKey = authInfo.getString("session_key");
+        // 根据code保存openId和sessionKey
+        JSONObject sessionObj = new JSONObject();
+        sessionObj.put("openId", openId);
+        sessionObj.put("sessionKey", sessionKey);
+        // sessionkey 保存到redis
+        redisService.setCacheObject(RedisKey.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX, sessionObj.toJSONString(), 10L, TimeUnit.DAYS);
+        infoJsonObject.put("unionid", authInfo.get("unionid"));
+        infoJsonObject.put("openId", openId);
+        infoJsonObject.put("sessionKey", sessionKey);
+        return AjaxResult.successZero(infoJsonObject);
+    }
+
+    private String validatWechatInfo(JSONObject authInfo) {
+        String errMsg = "";
+        int errcode =  (Integer) authInfo.get("errcode");
+        switch (errcode) {
+            case -1:
+                errMsg = "系统繁忙,此时请开发者稍候再试";
+                break;
+            case 40029:
+                errMsg = "code 无效";
+                break;
+            case 41002:
+                errMsg = "appId 丢失";
+                break;
+            case 45011:
+                errMsg = "频率限制,每个用户每分钟100次";
+                break;
+            default:
+                errMsg = "信息接口调用未知错误";
+                break;
+        }
+        return errMsg;
+    }
+
+    /**
+     * 获取小程序验证信息
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    private JSONObject getSessionKeyAndOpenId(String code) throws Exception {
+        Map<String, String> requestUrlParam = new HashMap<>();
+        // 小程序appId,自己补充
+        requestUrlParam.put("appid", properties.getAppId());
+        // 小程序secret,自己补充
+        requestUrlParam.put("secret", properties.getSecret());
+        // 小程序端返回的code
+        requestUrlParam.put("js_code", code);
+        // 默认参数
+        requestUrlParam.put("grant_type", properties.getGrantType());
+        // 发送post请求读取调用微信接口获取openid用户唯一标识
+        String result = HttpClientUtils.doGet(properties.getHost(), requestUrlParam);
+        return JSON.parseObject(result);
+    }
+}

+ 92 - 0
boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java

@@ -0,0 +1,92 @@
+package com.boman.wechat.utils;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpClientUtils {
+
+    final static int TIMEOUT = 1000;
+    final static int TIMEOUT_MSEC = 5 * 1000;
+
+    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建参数列表
+            if (paramMap != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (Map.Entry<String, String> param : paramMap.entrySet()) {
+                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+
+            httpPost.setConfig(builderRequestConfig());
+
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doGet(String url, Map<String, String> paramMap) throws IOException {
+        url += "?appid=" + paramMap.get("appid") + "&secret=" + paramMap.get("secret") + "&js_code=" + paramMap.get("js_code") + "&grant_type=" + paramMap.get("grant_type");
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpGet httpGet = new HttpGet(url);
+            // 执行http请求
+            response = httpClient.execute(httpGet);
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+        return resultString;
+    }
+
+    private static RequestConfig builderRequestConfig() {
+        return RequestConfig.custom()
+                .setConnectTimeout(TIMEOUT_MSEC)
+                .setConnectionRequestTimeout(TIMEOUT_MSEC)
+                .setSocketTimeout(TIMEOUT_MSEC).build();
+    }
+}

+ 4 - 0
boman-wechat/src/main/resources/application.properties

@@ -0,0 +1,4 @@
+auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
+auth.wechat.appId=
+auth.wechat.secret=
+auth.wechat.grantType=authorization_code

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,19 @@
+server:
+  port: 7000
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: prod
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 118.178.139.79:8848
+        namespace: 5d3b2dc4-f69e-47de-baa1-234d60012c04
+      config:
+        server-addr: 118.178.139.79:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 5d3b2dc4-f69e-47de-baa1-234d60012c04

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-test.yml

@@ -0,0 +1,19 @@
+server:
+  port: 7000
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: test
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3

+ 19 - 0
boman-wechat/src/main/resources/bootstrap.yml

@@ -0,0 +1,19 @@
+server:
+  port: 8093
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: jiaoyu
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局

+ 74 - 0
boman-wechat/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/boman-web-core" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.boman" level="debug" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="debug">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 4 - 0
boman-wechat/src/main/resources/rebel-remote.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rebel-remote xmlns="http://www.zeroturnaround.com/rebel/remote">
+    <id>com.boman.boman-wechat</id>
+</rebel-remote>

+ 16 - 0
boman-wechat/src/main/resources/rebel.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  This is the JRebel configuration file. It maps the running application to your IDE workspace, enabling JRebel reloading for this project.
+  Refer to https://manuals.jrebel.com/jrebel/standalone/config.html for more information.
+-->
+<application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_3.xsd">
+
+	<id>boman-wechat</id>
+
+	<classpath>
+		<dir name="E:/jiaoyuju/boman-wechat/target/classes">
+		</dir>
+	</classpath>
+
+</application>

+ 1 - 0
pom.xml

@@ -231,6 +231,7 @@
 		<module>boman-api</module>
 		<module>boman-common</module>
 		<module>boman-web-core</module>
+        <module>boman-wechat</module>
     </modules>
     <packaging>pom</packaging>
 

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott