Explorar el Código

Merge remote-tracking branch 'origin/master'

Administrator hace 3 años
padre
commit
51242ef144
Se han modificado 33 ficheros con 856 adiciones y 44 borrados
  1. 130 0
      boman-admin/pom.xml
  2. 35 0
      boman-admin/src/main/java/com/boman/admin/BomanAdminApplication.java
  3. 19 0
      boman-admin/src/main/resources/bootstrap-prod.yml
  4. 19 0
      boman-admin/src/main/resources/bootstrap.yml
  5. 74 0
      boman-admin/src/main/resources/logback.xml
  6. 4 2
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java
  7. 12 0
      boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java
  8. 10 0
      boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java
  9. 15 0
      boman-api/boman-domain/src/main/java/com.boman.domain/TemplateData.java
  10. 73 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/WxMsgDto.java
  11. 8 6
      boman-auth/src/main/java/com/boman/auth/controller/TokenController.java
  12. 8 0
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java
  13. 2 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java
  14. 5 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java
  15. 4 2
      boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml
  16. 1 0
      boman-visual/boman-monitor/src/main/java/com/boman/modules/monitor/config/WebSecurityConfigurer.java
  17. 6 0
      boman-web-core/pom.xml
  18. 1 1
      boman-web-core/src/main/java/com/boman/web/core/mapper/MessageMapper.java
  19. 43 18
      boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java
  20. 22 1
      boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java
  21. 2 2
      boman-wechat/pom.xml
  22. 14 0
      boman-wechat/src/main/java/com/boman/wechat/config/WechatConfiguration.java
  23. 35 2
      boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java
  24. 62 0
      boman-wechat/src/main/java/com/boman/wechat/controller/CheckPushMsgAuthController.java
  25. 25 4
      boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java
  26. 6 0
      boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java
  27. 12 0
      boman-wechat/src/main/java/com/boman/wechat/service/WxPushService.java
  28. 15 1
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java
  29. 105 0
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WxPushServiceImpl.java
  30. 79 0
      boman-wechat/src/main/java/com/boman/wechat/utils/CheckAuthUtils.java
  31. 8 4
      boman-wechat/src/main/resources/application.properties
  32. 1 1
      boman-wechat/src/main/resources/bootstrap.yml
  33. 1 0
      pom.xml

+ 130 - 0
boman-admin/pom.xml

@@ -0,0 +1,130 @@
+<?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>jiaoyuju-admin</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.jeecgframework.jimureport</groupId>
+            <artifactId>jimureport-spring-boot-starter</artifactId>
+            <version>1.3.75</version>
+        </dependency>
+<!--宋体字体-->
+        <dependency>
+            <groupId>org.jeecgframework.jimureport</groupId>
+            <artifactId>jimureport-font</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+
+        <!-- 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>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-visual</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 35 - 0
boman-admin/src/main/java/com/boman/admin/BomanAdminApplication.java

@@ -0,0 +1,35 @@
+package com.boman.admin;
+
+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;
+
+/**
+ * web-core
+ *
+ * @author shiqian
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringCloudApplication
+@ComponentScan(value = {"com.boman", "org.jeecg.modules.jmreport"})
+public class BomanAdminApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BomanAdminApplication.class, args);
+        System.out.println();
+        System.out.println();
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println("---------------------------------------------- boman-admin 模块启动成功----------------------------------------------");
+        System.out.println();
+        System.out.println();
+    }
+}

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

@@ -0,0 +1,19 @@
+server:
+  port: 1234
+
+spring:
+  application:
+    name: boman-admin
+  profiles:
+    active: prod
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+        namespace: bbba8691-596e-436f-9b72-a28e8db0da40
+      config:
+        server-addr: 127.0.0.1:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: bbba8691-596e-436f-9b72-a28e8db0da40

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

@@ -0,0 +1,19 @@
+server:
+  port: 1234
+
+spring: 
+  application:
+    name: boman-admin
+  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-admin/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-admin" />
+   <!-- 日志输出格式 -->
+	<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="admin_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>WARN</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="admin_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="admin_info" />
+        <appender-ref ref="admin_error" />
+    </root>
+</configuration>

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

@@ -17,8 +17,7 @@ import java.util.List;
  * @author ruoyi
  */
 @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
-public interface RemoteUserService
-{
+public interface RemoteUserService {
     /**
      * 通过用户名查询用户信息
      *
@@ -39,4 +38,7 @@ public interface RemoteUserService
 
     @PostMapping("/user/updateUnionId")
     public AjaxResult updateUnionId(@RequestBody SysUser sysUser);
+
+    @PostMapping("/user/selectUserByIds")
+    public AjaxResult selectUserByIds(@RequestBody List<Long> userIds);
 }

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

@@ -3,11 +3,14 @@ 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.dto.WxMsgDto;
 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;
 
+import java.util.Map;
+
 @FeignClient(contextId = "remoteObjService", value = ServiceNameConstants.WECHAT_SERVICE)
 public interface RemoteWechatService {
 
@@ -19,4 +22,13 @@ public interface RemoteWechatService {
      */
     @PostMapping("/wechat/p/c/wechatInfo")
     AjaxResult getWechatInfo(@RequestBody LoginBody loginBody);
+
+    /**
+     * 发送消息
+     *
+     * @param dto
+     * @return
+     */
+    @PostMapping("/wechat/p/c/pushMsg")
+    public Map<String, Object> pushMsg(@RequestBody WxMsgDto dto);
 }

+ 10 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java

@@ -94,6 +94,8 @@ public class SysUser extends BaseEntity
 
     private String unionId;
 
+    private String openId;
+
     public SysUser()
     {
 
@@ -317,6 +319,14 @@ public class SysUser extends BaseEntity
         this.unionId = unionId;
     }
 
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 15 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/TemplateData.java

@@ -0,0 +1,15 @@
+package com.boman.domain;
+
+import lombok.Data;
+
+public class TemplateData {
+    private Object value;
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+}

+ 73 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/WxMsgDto.java

@@ -0,0 +1,73 @@
+package com.boman.domain.dto;
+
+import com.boman.domain.TemplateData;
+
+import java.util.List;
+import java.util.Map;
+
+public class WxMsgDto {
+
+    private String touser;//用户openid
+    private String template_id;//模版id
+    private String page = "pages/indexView/addressee/index";//默认跳到小程序首页
+    private String emphasis_keyword = "title.DATA";//放大那个推送字段
+    private Map<String, TemplateData> data;//推送文字
+    private List<Long> ids;
+    private Map<String, Object> params;
+
+    public String getTouser() {
+        return touser;
+    }
+
+    public void setTouser(String touser) {
+        this.touser = touser;
+    }
+
+    public String getTemplate_id() {
+        return template_id;
+    }
+
+    public void setTemplate_id(String template_id) {
+        this.template_id = template_id;
+    }
+
+    public String getPage() {
+        return page;
+    }
+
+    public void setPage(String page) {
+        this.page = page;
+    }
+
+    public String getEmphasis_keyword() {
+        return emphasis_keyword;
+    }
+
+    public void setEmphasis_keyword(String emphasis_keyword) {
+        this.emphasis_keyword = emphasis_keyword;
+    }
+
+    public Map<String, TemplateData> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, TemplateData> data) {
+        this.data = data;
+    }
+
+    public List<Long> getIds() {
+        return ids;
+    }
+
+    public void setIds(List<Long> ids) {
+        this.ids = ids;
+    }
+
+    public Map<String, Object> getParams() {
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params) {
+        this.params = params;
+    }
+}

+ 8 - 6
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -17,6 +17,8 @@ import com.boman.common.core.utils.StringUtils;
 import com.boman.common.security.service.TokenService;
 import com.boman.system.api.model.LoginUser;
 
+import java.util.Map;
+
 /**
  * token 控制
  *
@@ -37,28 +39,28 @@ public class TokenController {
 
     @PostMapping("login")
     public R<?> login(@RequestBody LoginBody form) {
-        String unionId = "";
+        String openId = "";
         // 验证是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);
+            Map<String, Object> jsonObject = (Map<String, Object>) result.get(AjaxResult.DATA_TAG);
             if (jsonObject == null) {
                 throw new BaseException("未获取到微信鉴权相关信息!");
             }
-            unionId = (String) jsonObject.get("unionid");
+            openId = (String) jsonObject.get("openId");
         }
         // 用户登录
         LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
         // 如果是微信登录并且获取到的用户的unionId不为空
         if (form.getLogintype() != null
                 && form.getLogintype().equals(WechatEnum.W.getValue())
-                && StringUtils.isNotEmpty(unionId)) {
+                && StringUtils.isNotEmpty(openId)) {
             SysUser sysUser = new SysUser();
-            sysUser.setId(userInfo.getUserid());
-            sysUser.setUnionId(unionId);
+            sysUser.setId(userInfo.getSysUser().getId());
+            sysUser.setOpenId(openId);
             AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
             if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
                 throw new BaseException("保存小程序唯一标识出错!");

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

@@ -293,4 +293,12 @@ public class SysUserController extends BaseController {
     public AjaxResult listUserTree(SysDept dept) {
         return AjaxResult.success(userService.listUserTree(dept));
     }
+
+    /**
+     * 获取用户列表
+     */
+    @PostMapping("/selectUserByIds")
+    public AjaxResult selectUserByIds(@RequestBody List<Long> ids) {
+        return AjaxResult.success(userService.selectUserByIds(ids));
+    }
 }

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

@@ -45,6 +45,8 @@ public interface ISysUserService
      */
     public AjaxResult updateUnionId(SysUser sysUser);
 
+    public List<SysUser> selectUserByIds(List<Long> ids);
+
     /**
      * 根据用户ID查询用户所属角色组
      * 

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

@@ -80,6 +80,11 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserList(user);
     }
 
+    @Override
+    public List<SysUser> selectUserByIds(List<Long> ids) {
+        return userMapper.selectUserByUserIds(ids);
+    }
+
     /**
      * 通过用户名查询用户
      * 

+ 4 - 2
boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -23,6 +23,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateBy"     column="update_by"    />
 		<result property="updateTime"   column="update_time"  />
 		<result property="remark"       column="remark"       />
+		<result property="openId"       column="open_id"       />
+		<result property="unionId"       column="union_id"       />
 		<association property="dept"    column="dept_id" javaType="com.boman.domain.SysDept" resultMap="deptResult" />
 		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
 	</resultMap>
@@ -47,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<sql id="selectUserVo">
         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,
+        d.id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,u.open_id,
         r.id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.id
@@ -142,7 +144,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</insert>
 
 	<update id="updateUnionId" parameterType="com.boman.domain.SysUser">
-		update sys_user set union_id = #{unionId} where id = #{id}
+		update sys_user set open_id = #{openId} where id = #{id}
 	</update>
 
 	

+ 1 - 0
boman-visual/boman-monitor/src/main/java/com/boman/modules/monitor/config/WebSecurityConfigurer.java

@@ -35,6 +35,7 @@ public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter
                 , adminContextPath + "/login"
                 , adminContextPath + "/actuator/**"
                 , adminContextPath + "/instances/**"
+                , adminContextPath + "/jmreport/**"
             ).permitAll()
             .anyRequest().authenticated()
             .and()

+ 6 - 0
boman-web-core/pom.xml

@@ -118,6 +118,12 @@
             <artifactId>boman-api-jflow</artifactId>
             <version>2.5.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-wechat</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 1 - 1
boman-web-core/src/main/java/com/boman/web/core/mapper/MessageMapper.java

@@ -95,7 +95,7 @@ public interface MessageMapper {
         }
 
         public String selectByCondition(Map<String, Object> para) {
-            String result = "SELECT t.message_title, t.message_code, t.send_user_id, t.send_user_name, t.create_dept_name, r.receive_time, t.id, "
+            String result = "SELECT t.message_title, t.message_code, t.send_user_id, t.send_user_name, t.create_dept_name, r.send_time as receive_time, t.id,r.from_dept_name, "
                     + " t.finish_time, r.id as receive_id FROM boman_message t JOIN urge_read_message u ON u.message_id = t.id  AND u.receive_user_name = '" + para.get("username") + "' "
                     + " JOIN boman_message_receive r on r.receive_user_name = u.receive_user_name and r.message_id = t.id "
                     + " WHERE t.is_del = 'N'  and r.`status` = 'N' ORDER BY t.create_time DESC  LIMIT " + para.get("limit") + "," + para.get("offset");

+ 43 - 18
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -32,13 +32,13 @@ import com.boman.web.core.service.update.IBaseUpdateService;
 import com.boman.web.core.utils.ColumnUtils;
 import com.boman.web.core.utils.IdUtils;
 import com.boman.web.core.utils.JSONObjectUtils;
+import com.boman.wechat.api.RemoteWechatService;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.framework.AopContext;
-import org.springframework.aop.support.AopUtils;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -92,6 +92,9 @@ public class TableServiceCmdService {
     private RemoteMenuService remoteMenuService;
     @Resource
     private RemoteJflowProcessService remoteJflowProcessService;
+    @Resource
+    private RemoteWechatService remoteWechatService;
+
 
     private static final Logger LOGGER = LoggerFactory.getLogger(TableServiceCmdService.class);
 
@@ -114,7 +117,7 @@ public class TableServiceCmdService {
         //判断时候有定制新增接口
         List<JSONObject> listData = new ArrayList<>();
         listData.add(context.getCommitData());
-        isCustomized(context.getTableName(),listData,"trigger_create");
+        isCustomized(context.getTableName(), listData, "trigger_create");
 
         AjaxResult result;
         // 新增
@@ -169,6 +172,8 @@ public class TableServiceCmdService {
         List<AjaxResult> resultList = new ArrayList<>(result.size());
         Map<String, Long> tableNameIdMap = new HashMap<>(result.size());
         AjaxResult ajaxResult;
+        List<Long> receiveUserIds = new ArrayList<>();
+        Map<String, Object> messageInfo = new HashMap<>();
         for (int i = 0; i < result.size(); i++) {
             FormDataDto formDataDto = result.get(i);
             boolean optPrimaryTable = i == 0;
@@ -188,8 +193,25 @@ public class TableServiceCmdService {
 
             tableNameIdMap.put(tableName, fkId);
             resultList.add(ajaxResult);
-        }
 
+            if (dto.getTable().equals("boman_message")) {
+                if (optPrimaryTable) {
+                    messageInfo.put("thing1", formDataDto.getFixedData().getString("message_title"));
+                    messageInfo.put("thing2", formDataDto.getFixedData().getString("send_user_name"));
+                } else {
+                    receiveUserIds.add(formDataDto.getFixedData().getLong("receive_user_id"));
+                }
+            }
+
+        }
+        // 获取发文相关信息
+        if (dto.getTable().equals("boman_message")) {
+            WxMsgDto wxMsgDto = new WxMsgDto();
+            wxMsgDto.setIds(receiveUserIds);
+            wxMsgDto.setParams(messageInfo);
+            LOGGER.info("收文人id:{}, 发送数据: {}", receiveUserIds, messageInfo);
+            remoteWechatService.pushMsg(wxMsgDto);
+        }
         return AjaxResult.success(resultList);
     }
 
@@ -467,8 +489,11 @@ public class TableServiceCmdService {
                             }
                         }
                         // dateTime
-                        if (NEED_CONVERT_DATE_LIST.contains(columnType)) {
+                        // dateTime
+                        if (DATE.equals(columnType)) {
                             column.setColumnValue(getStrDate(json.getTimestamp(columnName)));
+                        } else if (DATETIME.equals(columnType)) {
+                            column.setColumnValue(getStrTimeStamp(json.getTimestamp(columnName)));
                         }
                         // fk
                         if (isNotEmpty(column.getForeignKey())) {
@@ -576,7 +601,7 @@ public class TableServiceCmdService {
                 // dateTime
                 if (NEED_CONVERT_DATE_LIST.contains(columnType)) {
                     assert value instanceof Timestamp;
-                    column.setColumnValue(getStrDate((Timestamp)value));
+                    column.setColumnValue(getStrDate((Timestamp) value));
                 }
                 // fk
                 if (isNotEmpty(column.getForeignKey())) {
@@ -586,7 +611,7 @@ public class TableServiceCmdService {
                 }
                 // annex
                 if (HTML_IMAGE_UPLOAD.equalsIgnoreCase(htmlType) || HTML_FILE_UPLOAD.equalsIgnoreCase(htmlType)) {
-                    column.setAnnex(getAnnex((String)value));
+                    column.setAnnex(getAnnex((String) value));
                 }
 
                 children.add(column);
@@ -622,7 +647,7 @@ 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) {
+        if (jsonObject == null) {
             return AjaxResult.error("没有表单数据", jsonObject);
         }
         List<GenTableColumn> columns = genTable.getColumns();
@@ -648,7 +673,7 @@ public class TableServiceCmdService {
         }
         JSONObject result = new JSONObject();
         result.put("childs", addcolums);
-        result.put("size",columns.size());
+        result.put("size", columns.size());
 
         JSONArray adc = new JSONArray();
         adc.add(result);
@@ -876,9 +901,9 @@ public class TableServiceCmdService {
         for (JSONObject commitDatum : commitData) {
             String dbStatus = getStatusFromFormData(commitDatum, beforeList);
             // 只能是未提交的状态下,才能调用提交
-            if(StringUtils.isNotEmpty(condition.getSubmitSource())) {
+            if (StringUtils.isNotEmpty(condition.getSubmitSource())) {
                 handlerSubmit(tableName, pkName, commitDatum);
-            }else {
+            } else {
                 if (isSubmit) {
                     // 只能是未提交的状态下,才能调用提交, 下面是不允许
                     if (!SubmitConstant.NOT_SUBMIT.equals(dbStatus)) {
@@ -913,7 +938,7 @@ public class TableServiceCmdService {
         String tableName = requireNonNull(genTable.getTableName(), "tableName = [" + genTable.getTableName() + "] 此表不存在");
 
         List<JSONObject> commitData = condition.getCommitData();
-        for(JSONObject commitDatum : commitData) {
+        for (JSONObject commitDatum : commitData) {
             Long foreignKey = Long.valueOf(commitDatum.get("foreignKey").toString());
             String foreignKeyName = (String) commitDatum.get("foreignKeyName");
             this.executeData(tableName, foreignKeyName, foreignKey, (Map<String, Object>) commitDatum.get("updateData"));
@@ -925,10 +950,10 @@ public class TableServiceCmdService {
     /**
      * 功能描述: 修改数据
      *
-     * @param tableName   tableName
+     * @param tableName      tableName
      * @param foreignKeyName 外键名
-     * @param foreignKey  外键值
-     * @param commitDatum 返回给前台的数据
+     * @param foreignKey     外键值
+     * @param commitDatum    返回给前台的数据
      */
     private void executeData(String tableName, String foreignKeyName, Long foreignKey, Map<String, Object> commitDatum) {
         int effective = submitService.executeData(tableName, foreignKeyName, foreignKey, new JSONObject(commitDatum));
@@ -1127,7 +1152,7 @@ public class TableServiceCmdService {
     }
 
     private void addOtherColumn(List<GenTableColumn> columns, String other) {
-        if(StringUtils.isEmpty(other)) {
+        if (StringUtils.isEmpty(other)) {
             return;
         }
 
@@ -1143,7 +1168,7 @@ public class TableServiceCmdService {
 
         String dictType = column.getDictType();
         String columnName = column.getColumnName();
-        if(StringUtils.isEmpty(other)) {
+        if (StringUtils.isEmpty(other)) {
             jo.put("valuedata", jsonObject.get(columnName));
             return;
         }
@@ -1153,7 +1178,7 @@ public class TableServiceCmdService {
             List<SysDictData> sysDictData = column.getSysDictData();
             //获取到字段的值
             String value = String.valueOf(jsonObject.get(columnName));
-            if (sysDictData != null && sysDictData.size() > 0){
+            if (sysDictData != null && sysDictData.size() > 0) {
                 for (SysDictData sysDictDatum : sysDictData) {
                     if (sysDictDatum.getDictValue().equals(value)) {
                         jo.put("valuedata", sysDictDatum.getDictLabel());
@@ -1161,7 +1186,7 @@ public class TableServiceCmdService {
                     }
                 }
             }
-        }else{
+        } else {
             jo.put("valuedata", jsonObject.get(columnName));
         }
     }

+ 22 - 1
boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java

@@ -5,10 +5,12 @@ import com.boman.common.redis.service.RedisService;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.constant.FormDataConstant;
 import com.boman.domain.constant.TableNameConst;
+import com.boman.domain.dto.WxMsgDto;
 import com.boman.web.core.domain.RowResult;
 import com.boman.web.core.mapper.StandardMapper;
 import com.boman.web.core.utils.ColumnUtils;
 import com.boman.web.core.utils.IdUtils;
+import com.boman.wechat.api.RemoteWechatService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +19,9 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.sql.Timestamp;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.web.core.utils.ColumnUtils.*;
@@ -36,6 +40,9 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
     private StandardMapper mapper;
     @Resource
     private RedisService redisService;
+    @Resource
+    private RemoteWechatService remoteWechatService;
+
     /**
      * 功能描述: 保存一行
      *
@@ -85,6 +92,8 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
         List<RowResult> rowResults = new ArrayList<>(dataList.size());
         List<GenTableColumn> columns = ColumnUtils.getColumnList(tableName);
         String pkName = IdUtils.getPkName(columns);
+        List<Long> receiveUserIds = new ArrayList<>();
+        Map<String, Object> messageInfo = new HashMap<>();
         for (JSONObject commitData : dataList) {
             Long maxId = IdUtils.getMaxId(tableName, pkName);
             packUpdateByAndTime(columns, commitData, new Timestamp(System.currentTimeMillis()), true);
@@ -94,8 +103,20 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
             buildBillRule(tableName, commitData, columns);
             commitData.put(pkName, maxId);
             rowResults.add(insertRow(tableName, commitData));
+            if (tableName.equals("urge_read_message")) {
+                receiveUserIds.add(commitData.getLong("receive_user_id"));
+            }
+        }
+        messageInfo.put("thing1", dataList.get(0).getString("message_title"));
+        messageInfo.put("thing2", dataList.get(0).getString("send_user_name"));
+        // 获取发文相关信息
+        if (tableName.equals("urge_read_message")) {
+            WxMsgDto wxMsgDto = new WxMsgDto();
+            wxMsgDto.setIds(receiveUserIds);
+            wxMsgDto.setParams(messageInfo);
+            LOGGER.info("收文人id:{}, 发送数据: {}", receiveUserIds, messageInfo);
+            remoteWechatService.pushMsg(wxMsgDto);
         }
-
         return rowResults;
     }
 

+ 2 - 2
boman-wechat/pom.xml

@@ -8,7 +8,7 @@
         <version>2.5.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>boman-wechat</artifactId>
+    <artifactId>jiaoyu-wechat</artifactId>
 
     <properties>
 
@@ -104,7 +104,7 @@
     </dependencies>
 
     <build>
-        <finalName>${project.artifactId}</finalName>
+        <finalName>jiaoyuju-wechat</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 14 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatConfiguration.java

@@ -0,0 +1,14 @@
+package com.boman.wechat.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class WechatConfiguration {
+
+    @Bean
+    public RestTemplate initRestTemplate() {
+       return new RestTemplate();
+    }
+}

+ 35 - 2
boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java

@@ -1,9 +1,11 @@
 package com.boman.wechat.config;
 
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
 
-@Component
+@Configuration
+@RefreshScope
 public class WechatProperties {
 
     @Value("${auth.wechat.sessionHost}")
@@ -18,6 +20,13 @@ public class WechatProperties {
     @Value("${auth.wechat.grantType}")
     private String grantType;
 
+    @Value("${auth.wechat.template_id}")
+    private String templateId;
+    @Value("${auth.wechat.access_token_url}")
+    private String accessTokenUrl;
+    @Value("${auth.wechat.msg_url}")
+    private String msgUrl;
+
 
     public String getHost() {
         return host;
@@ -50,4 +59,28 @@ public class WechatProperties {
     public void setGrantType(String grantType) {
         this.grantType = grantType;
     }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getAccessTokenUrl() {
+        return accessTokenUrl;
+    }
+
+    public void setAccessTokenUrl(String accessTokenUrl) {
+        this.accessTokenUrl = accessTokenUrl;
+    }
+
+    public String getMsgUrl() {
+        return msgUrl;
+    }
+
+    public void setMsgUrl(String msgUrl) {
+        this.msgUrl = msgUrl;
+    }
 }

+ 62 - 0
boman-wechat/src/main/java/com/boman/wechat/controller/CheckPushMsgAuthController.java

@@ -0,0 +1,62 @@
+package com.boman.wechat.controller;
+
+import com.boman.domain.dto.WxMsgDto;
+import com.boman.wechat.service.WxPushService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.boman.wechat.utils.CheckAuthUtils.*;
+
+/**
+ * 微信登录验证
+ *
+ * @author zhong.h
+ */
+@RestController
+@RequestMapping("/check/auth")
+public class CheckPushMsgAuthController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CheckPushMsgAuthController.class);
+
+    @GetMapping
+    public String pushMsg(HttpServletRequest request, HttpServletResponse response) {
+        // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
+        String signature = request.getParameter(SIGNATURE);
+        // 时间戳
+        String timestamp = request.getParameter(TIMESTAMP);
+        // 随机数
+        String nonce = request.getParameter(NONCE);
+        // 随机字符串
+        String echostr = request.getParameter(ECHOSTR);
+        String authorization = request.getParameter(AUTHORIZATION);
+        LOGGER.info("接收来自微信的消息, signature: {}, timestamp: {}, nonce: {}, echostr: {}, authorization: {}"
+                , signature, timestamp, nonce, echostr, authorization);
+//        PrintWriter out = null;
+//        try {
+//            out = response.getWriter();
+            if (checkSignature(signature, timestamp, nonce)) {
+//                out.print(echostr);
+//                out.flush();
+                return echostr;
+            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        } finally {
+//            if (Objects.nonNull(out)) {
+//                out.close();
+//            }
+//        }
+
+        return echostr;
+    }
+
+
+}

+ 25 - 4
boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java

@@ -1,14 +1,15 @@
 package com.boman.wechat.controller;
 
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.WxMsgDto;
 import com.boman.domain.form.LoginBody;
 import com.boman.wechat.service.WechatService;
+import com.boman.wechat.service.WxPushService;
 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;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 /**
  * 微信登录验证
@@ -19,6 +20,9 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class WechatInfoController {
 
+    @Autowired
+    private WxPushService wxPushService;
+
     @Autowired
     private WechatService wechatService;
 
@@ -27,4 +31,21 @@ public class WechatInfoController {
     public AjaxResult getWechatInfo(@RequestBody LoginBody loginBody) {
         return wechatService.getWechatInfo(loginBody);
     }
+
+    @ApiOperation(value = "小程序模板id获取")
+    @GetMapping("/tmpIds")
+    public AjaxResult getTmpIds() {
+        return wechatService.getTmpIds();
+    }
+
+    /**
+     * 发送消息
+     *
+     * @param dto
+     * @return
+     */
+    @PostMapping("/pushMsg")
+    public Map<String, Object> pushMsg(@RequestBody WxMsgDto dto) {
+        return wxPushService.pushToUser(dto);
+    }
 }

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

@@ -11,4 +11,10 @@ import com.boman.domain.form.LoginBody;
 public interface WechatService {
 
     AjaxResult getWechatInfo(LoginBody loginBody);
+
+    /**
+     * 获取模板id集合
+     * @return
+     */
+    AjaxResult getTmpIds();
 }

+ 12 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WxPushService.java

@@ -0,0 +1,12 @@
+package com.boman.wechat.service;
+
+import com.boman.domain.dto.WxMsgDto;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WxPushService {
+
+    public Map<String, Object> pushToUser(WxMsgDto dto);
+
+}

+ 15 - 1
boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java

@@ -53,6 +53,7 @@ public class WechatServiceImpl implements WechatService {
         if(authInfo == null) {
             return AjaxResult.error(-1, "未获取到认证");
         }
+        logger.info("微信返回的数据:" + authInfo.toJSONString());
         String errMsg = this.validatWechatInfo(authInfo);
         if(StringUtils.isNotEmpty(errMsg)) {
             return AjaxResult.error(-1, errMsg);
@@ -70,9 +71,17 @@ public class WechatServiceImpl implements WechatService {
         infoJsonObject.put("unionid", authInfo.get("unionid"));
         infoJsonObject.put("openId", openId);
         infoJsonObject.put("sessionKey", sessionKey);
+        logger.info("微信登陆验证返回的数据: " + infoJsonObject.toJSONString());
         return AjaxResult.successZero(infoJsonObject);
     }
 
+    @Override
+    public AjaxResult getTmpIds() {
+        String str = properties.getTemplateId();
+        String[] ids = str.split(",");
+        return AjaxResult.success(ids);
+    }
+
     /**
      * 解析返回的状态码对应的问题
      *
@@ -81,7 +90,10 @@ public class WechatServiceImpl implements WechatService {
      */
     private String validatWechatInfo(JSONObject authInfo) {
         String errMsg = "";
-        int errcode =  (Integer) authInfo.get("errcode");
+        Integer errcode =  (Integer) authInfo.get("errcode");
+        if(errcode == null) {
+            return errMsg;
+        }
         switch (errcode) {
             case -1:
                 errMsg = "系统繁忙,此时请开发者稍候再试";
@@ -94,6 +106,8 @@ public class WechatServiceImpl implements WechatService {
                 break;
             case 45011:
                 errMsg = "频率限制,每个用户每分钟100次";
+            case 40163:
+                errMsg = "code已经被使用";
                 break;
             default:
                 errMsg = (String) authInfo.get("errmsg");

+ 105 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WxPushServiceImpl.java

@@ -0,0 +1,105 @@
+package com.boman.wechat.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.domain.TemplateData;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.WxMsgDto;
+import com.boman.system.api.RemoteUserService;
+import com.boman.wechat.config.WechatProperties;
+import com.boman.wechat.service.WxPushService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class WxPushServiceImpl implements WxPushService {
+    private static final Logger logger = LoggerFactory.getLogger(WxPushServiceImpl.class);
+
+    //用来请求微信的get和post
+    @Autowired
+    private RestTemplate restTemplate;
+    @Autowired
+    private WechatProperties properties;
+    @Autowired
+    private RemoteUserService remoteUserService;
+
+    /**
+     * 微信小程序推送给用户
+     */
+    @Override
+    public Map<String, Object> pushToUser(WxMsgDto dto) {
+        logger.info("WxMsgDto {}", JSON.toJSONString(dto));
+        logger.info("properties {}", JSON.toJSONString(properties));
+        List<Long> userIds = dto.getIds();
+        Map<String, Object> params = dto.getParams();
+        Map<String, Object> pushResult = new HashMap<>();
+
+        //获取access_token
+        String accessToken = getAccessToken();
+        if(StringUtils.isEmpty(accessToken)) {
+            pushResult.put("msg", "获取access_token失败");
+            return pushResult;
+        }
+
+        String url = properties.getMsgUrl() + "?access_token=" + accessToken;
+        AjaxResult result = remoteUserService.selectUserByIds(userIds);
+        List<Map<String, Object>> users = (List<Map<String, Object>>) result.get("data");
+        if(users == null || users.size() <= 0) {
+            pushResult.put("msg", "推送失败,没有选择推送人员");
+            return pushResult;
+        }
+
+        WxMsgDto wxMssVo = new WxMsgDto();
+        Map<String, String> responseResult = new HashMap<>();
+        for(Map user : users) {
+            String openId = (String) user.get("openId");
+            if(StringUtils.isEmpty(openId)) {
+                continue;
+            }
+            //拼接推送的模版
+//            WxMsgDto wxMssVo = new WxMsgDto();
+            wxMssVo.setTouser(openId);//用户openid
+            wxMssVo.setTemplate_id(properties.getTemplateId());//模版id
+            Map<String, TemplateData> msgMap = new HashMap<>(5);
+            for(String key : params.keySet()) {
+                TemplateData templateData = new TemplateData();
+                templateData.setValue(params.get(key));
+                msgMap.put(key, templateData);
+            }
+            wxMssVo.setData(msgMap);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class);
+            logger.info(" wxmssvo: " + JSON.toJSONString(wxMssVo));
+            JSONObject resultJsonObject = JSON.parseObject(responseEntity.getBody());
+            if((Integer) resultJsonObject.get("errcode") != 0) {
+                responseResult.put(user.get("id").toString(), "用户 " + user.get("nickName") + " 推送失败," + resultJsonObject.get("errmsg").toString());
+            }
+            logger.info("result {}", responseEntity.getBody());
+        }
+        if(responseResult.size() > 0) {
+            pushResult.put("msg", responseResult.toString());
+            pushResult.put("data", responseResult);
+        }
+        return pushResult;
+    }
+
+    /*
+     * 获取access_token
+     * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
+     * */
+    private String getAccessToken() {
+        //获取access_token
+        String url = properties.getAccessTokenUrl() + "&appid=" + properties.getAppId() + "&secret=" + properties.getSecret();
+        String json = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        return (String) jsonObject.get("access_token");
+    }
+}

+ 79 - 0
boman-wechat/src/main/java/com/boman/wechat/utils/CheckAuthUtils.java

@@ -0,0 +1,79 @@
+package com.boman.wechat.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * @author shiqian
+ * @date 2021年08月04日 13:38
+ **/
+public class CheckAuthUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CheckAuthUtils.class);
+
+    /** 定义Token 务必与服务器保持一**/
+    public static String AUTHORIZATION = "Authorization";
+
+    public static final String SIGNATURE = "signature";
+    public static final String TIMESTAMP = "timestamp";
+    public static final String NONCE = "nonce";
+    public static final String ECHOSTR = "echostr";
+    public static final String SHA_1 = "SHA-1";
+
+
+    /**
+     * 验证签名
+     *
+     * @param signature
+     * @param timestamp
+     * @param nonce
+     * @return
+     */
+    public static boolean checkSignature(String signature, String timestamp, String nonce) {
+        // 将token、timestamp、nonce三个参数进行字典排序
+        String[] arr = new String[]{AUTHORIZATION, timestamp, nonce};
+        Arrays.sort(arr);
+
+        // 将三个参数字符串拼接成一个字符串
+        StringBuilder content = new StringBuilder();
+        for (String s : arr) {
+            content.append(s);
+        }
+
+        try {
+            //获取加密工具
+            MessageDigest md = MessageDigest.getInstance(SHA_1);
+            // 对拼接好的字符串进行sha1加密
+            byte[] digest = md.digest(content.toString().getBytes());
+            String tmpStr = byteToStr(digest);
+            //获得加密后的字符串与signature对比
+            boolean result = tmpStr.equals(signature.toUpperCase());
+            LOGGER.info("method: checkSignature, tmpStr: {}, result: {}", tmpStr, result);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    private static String byteToStr(byte[] byteArray) {
+        StringBuilder strDigest = new StringBuilder();
+        for (byte b : byteArray) {
+            strDigest.append(byteToHexStr(b));
+        }
+        return strDigest.toString();
+    }
+
+    private static String byteToHexStr(byte mByte) {
+        char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+        char[] tempArr = new char[2];
+        tempArr[0] = digit[(mByte >>> 4) & 0X0F];
+        tempArr[1] = digit[mByte & 0X0F];
+        return new String(tempArr);
+    }
+
+}

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

@@ -1,4 +1,8 @@
-auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
-auth.wechat.appId=wxf556d2b0c34da8cf
-auth.wechat.secret=8f90a52972268f82d5017a2ac29650c4
-auth.wechat.grantType=authorization_code
+#auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
+#auth.wechat.msg_url=https://api.weixin.qq.com/cgi-bin/message/subscribe/send
+#auth.wechat.access_token_url=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
+#auth.wechat.appId=wxf556d2b0c34da8cf
+#auth.wechat.secret=8f90a52972268f82d5017a2ac29650c4
+#auth.wechat.grantType=authorization_code
+##auth.wechat.template_id=Dhunm8Bqy6lRDfYgJxYQnhKV6JxNIhFoov2MOJ0c6Dw
+#auth.wechat.template_id=OfdPlcfvEet4A1HZm3JXm3HyX4msme_T0vO4NdKo0xc

+ 1 - 1
boman-wechat/src/main/resources/bootstrap.yml

@@ -16,4 +16,4 @@ spring:
         file-extension: yml
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
-        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局
+·        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局

+ 1 - 0
pom.xml

@@ -232,6 +232,7 @@
 		<module>boman-common</module>
 		<module>boman-web-core</module>
         <module>boman-wechat</module>
+        <module>jiaoyuju-admin</module>
     </modules>
     <packaging>pom</packaging>